我正在写一个客户端和服务器通讯的多线程小程序,步骤很接单,服务器先运行,之后每个客户端打开的时候都可以享用一个独立线程,然后客户端向服务器发出货物请求:writeObject(order),服务器端接受readObject(order)之后处理,然后给客户端回复。现在我遇到一个问题,程序运行没有问题,当一个客户端给服务器发出第一个请求的时候,结果OK!
客户端:writeObject(order1),服务器:readObject(order1)。
但是当这个客户端修改了货物请求
客户端:writeObject(order2),问题出来了:服务器死活是:readObect(order1)。怎么也不变化。我调试了一下,从客户端writeObject(order2)之前的数据都是对的。连接也没有问题(第一次能成功),就是从服务器端出来的是第一次的order1,不管重复改变多少次,就是不行。
stream我也flush()了,实在找不出问题所在。打个比方:我第一次从一个管道这头送进一头牛,从管道那头就出了一头牛。
之后我不管送什么其它别的动物进去,那头就是出牛!!因为学习JAVA不久,所以请遇到过这种问题的哥们帮忙解决一下,给点提示。谢谢!
客户端:writeObject(order1),服务器:readObject(order1)。
但是当这个客户端修改了货物请求
客户端:writeObject(order2),问题出来了:服务器死活是:readObect(order1)。怎么也不变化。我调试了一下,从客户端writeObject(order2)之前的数据都是对的。连接也没有问题(第一次能成功),就是从服务器端出来的是第一次的order1,不管重复改变多少次,就是不行。
stream我也flush()了,实在找不出问题所在。打个比方:我第一次从一个管道这头送进一头牛,从管道那头就出了一头牛。
之后我不管送什么其它别的动物进去,那头就是出牛!!因为学习JAVA不久,所以请遇到过这种问题的哥们帮忙解决一下,给点提示。谢谢!
服务器端:
public class A3Server
extends JFrame
implements ActionListener { /** Constructor */
public A3Server() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
init();
}
catch (Exception e) {
e.printStackTrace();
}
} /** Initialize the constructor */
private void init() {
...
...
try {
// Create a server socket
ServerSocket serverSocekt = new ServerSocket(8000);
// For accept multithreads
while (true) {
jlClientNum.setText("There are " + clientNum +
" clients connecting to the server");
// Listen for a new connection request
Socket socket = serverSocekt.accept();
inetAddress = socket.getInetAddress();
jtaInfo.append("\n" + "Client \"" + inetAddress.getHostName() +
"\" established the connection.");
// Create a new thread for the connection
HandleAClient thread = new HandleAClient(socket);
thread.start();
clientNum++;
}
}
catch (IOException e) {
jtaInfo.append("\n" + e.toString());
}
}
/** Define the thread class for handling new connection */
class HandleAClient
extends Thread {
private Socket socket;
public HandleAClient(Socket socket) {
this.socket = socket;
}
/** Run a thread */
public void run() {
try {
// Create data input and output streams
ObjectOutputStream outputToClient = new ObjectOutputStream(
socket.getOutputStream());
ObjectInputStream inputFromClient = new ObjectInputStream(
socket.getInputStream()); // Send the initial inventory to the client
outputToClient.writeObject(vInventory);
outputToClient.flush(); // Continuously serve the client
while (true) {
// Receive one order from the client
Order oneOrder; //Order oneOrder = (Order) inputFromClient.readObject();
Object o = (Object) inputFromClient.readObject(); if (o instanceof String) {
oneOrder = null;
}
else {
oneOrder = (Order) o;
// Check order
if (checkOrder(oneOrder) == false) {
...
...
// Give feedback
}
else{
// Return error message
}
}
}
}
catch (ClassNotFoundException ex) {
jtaInfo.append(ex.toString());
}
catch (IOException e) {
clientNum--;
jlClientNum.setText("There are " + clientNum +
" clients connecting to the server");
jtaInfo.append("\n" + "One Client has quited!");
}
}
}
}
客户端:
public class A3Client
extends JApplet
implements ActionListener {
...
...
...
/**Initialize the applet*/
public void init() {
try {
jbInit();
}
catch (Exception e) {
e.printStackTrace();
}
} /** Component initialization*/
private void jbInit() throws Exception {
// Create a socket to connect to the server
Socket socket;
if (isStandalone) {
socket = new Socket("localhost", 8000);
}
else {
socket = new Socket(getCodeBase().getHost(), 8000);
}
// Create a input stream to receive the data from server
inputFromServer = new ObjectInputStream(socket.getInputStream());
outputToServer = new ObjectOutputStream(socket.getOutputStream());
...
...
...
// Open a thread for read and write
this.nl = new NetListener(inputFromServer);
this.nl.start();
} /** Components action events*/
public void actionPerformed(ActionEvent e) {
if (e.getSource() == jbAdd) {
...
...
else if (e.getSource() == jbConfirm) {
Client oneClient = new Client(jtfName.getText().trim(),
jtfAddress.getText().trim());
Order oneOrder = new Order(oneClient, vCart);
try {
if(vCart.size() > 0){
outputToServer.writeObject(oneOrder);
outputToServer.flush();
}
}
catch (IOException ex) {
jtaInfo.append(ex.toString());
}
}
} /** Run the applet as an application */
public static void main(String[] args) {
...
...
...
}
...
...
...
/** Inner class receive vector from server and bind to the list */
class NetListener
extends Thread {
ObjectInputStream ois; public NetListener(ObjectInputStream ois) {
this.ois = ois;
} public void run() {
while (true) {
try {
Object o = (Object) inputFromServer.readObject();
// If receive the message
if (o instanceof String) {
jtaInfo.append("\n" + o.toString());
}
// Get the changed Inventory
else {
...
...
...
}
}
catch (Exception ex) {
System.out.println(ex);
}
}
}
}
}
请大家帮忙看看!!谢谢!!