我正在写一个客户端和服务器通讯的多线程小程序,步骤很接单,服务器先运行,之后每个客户端打开的时候都可以享用一个独立线程,然后客户端向服务器发出货物请求:writeObject(order),服务器端接受readObject(order)之后处理,然后给客户端回复。现在我遇到一个问题,程序运行没有问题,当一个客户端给服务器发出第一个请求的时候,结果OK!
客户端:writeObject(order1),服务器:readObject(order1)。
但是当这个客户端修改了货物请求
客户端:writeObject(order2),问题出来了:服务器死活是:readObect(order1)。怎么也不变化。我调试了一下,从客户端writeObject(order2)之前的数据都是对的。连接也没有问题(第一次能成功),就是从服务器端出来的是第一次的order1,不管重复改变多少次,就是不行。
stream我也flush()了,实在找不出问题所在。打个比方:我第一次从一个管道这头送进一头牛,从管道那头就出了一头牛。
          之后我不管送什么其它别的动物进去,那头就是出牛!!因为学习JAVA不久,所以请遇到过这种问题的哥们帮忙解决一下,给点提示。谢谢!

解决方案 »

  1.   

    部分代码:
    服务器端:
    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);
            }
          }
        }
      }
    }
    请大家帮忙看看!!谢谢!!