代码之家  ›  专栏  ›  技术社区  ›  wishi

对象输出流和对象输出流

  •  1
  • wishi  · 技术社区  · 15 年前

    我已经编写了一个EchoServer,如果数据被相应地发送,它将用字符串ack响应。

    我的客户看起来像这样…为了从服务器接收ACK应答,“EchoSocket”将接收到的数据放入我的objectinputstream。只有当我把这些部分注释掉,客户才能工作。

            echoSocket = new Socket(server_name, tcp_port);
            System.out.println(" *** Connected to " + server_name  + " ***");
            System.out.println("Press Enter to send your message.");
    
            out = new ObjectOutputStream(echoSocket.getOutputStream());
            in = new ObjectInputStream(echoSocket.getInputStream());
    
            out.flush();
    
            String message = System.console().readLine();
    
            while(!message.equals("quit")) {
    
    
                // problem                
                if (in.readObject().equals(ack)) 
                    System.out.println("ACKed");
                in.close();
                // problem ends
                out.flush();
    
                out.writeObject(message);
                System.out.println("Sending: " + message);      
                message = System.console().readLine();
                out.flush();
    
            }
    

    有人知道为什么它不发送我的字符串吗?

    谢谢, 马吕斯

    4 回复  |  直到 15 年前
        1
  •  3
  •   bmargulies    15 年前

    在套接字上使用对象流实际上不是推荐的想法。您可以考虑使用完整的Web服务或RMI。

    如果在尝试使用对象流进行反序列化之前读取缓冲区并确保拥有整个业务,那么它可能会更好地工作。

        2
  •  2
  •   Karussell    15 年前
        3
  •  1
  •   Stephen C    15 年前

    看起来客户机在写消息之前试图阅读确认。

        4
  •  1
  •   Sam Barnum    15 年前

    将“发送”和“接收”代码拆分为单独的线程,编写器线程可以写入套接字,而您的另一个线程在调用时被阻止。 readObject() .

    如果这将是一个长期运行的客户机,我还建议使用较低级别的datainputstream和dataoutputstream,而不是objectinputstream/objectoutputstream,以防止保留对象的可能较大的identityhashmap。