【问题标题】:serialization in server/client服务器/客户端中的序列化
【发布时间】:2013-12-05 18:24:16
【问题描述】:

有服务器和客户端。客户端连接到服务器并向其发送一个对象。该对象必须返回给客户端。

服务器:

     ObjectInputStream inStream = new ObjectInputStream(this.socket.getInputStream());
     ObjectOutputStream outStream = new ObjectOutputStream(this.socket.getOutputStream());
        while (true){   
                    msg = (Message)inStream.readObject();
                    .........
                     outStream.writeObject(msg);
                     outStream.flush();

当我这样写时,我在 msg = (Message)inStream.readObject();

处得到 java.net.SocketException: socket closed

当我试图将它放入这样的循环中时:

        while (true){   
                    ObjectInputStream inStream = new ObjectInputStream(this.socket.getInputStream());
                    ObjectOutputStream outStream = new ObjectOutputStream(this.socket.getOutputStream());
                    msg = (Message)inStream.readObject();
                    .........
                     outStream.writeObject(msg);
                     outStream.flush();

我得到 java.net.SocketException: Socket is closedObjectInputStream inStream = new ObjectInputStream(this.socket.getInputStream());

客户:

 addr = InetAddress.getByName(IP);
        socket = new Socket(addr, PORT);
        ObjectOutputStream outStream = new ObjectOutputStream(socket.getOutputStream());
        outStream.writeObject(new Message(this.name,"/**//**/"));
        outStream.flush();
        ObjectInputStream inStream = new ObjectInputStream(socket.getInputStream());
        Message answer = (Message)inStream.readObject();

告诉我我做错了什么? 还有其他方法可以让服务器等待来自客户端的一些数据吗? 顺便说一句,对不起我的英语,这不是我的母语。

【问题讨论】:

  • 可能在服务器能够写入之前客户端已关闭。一旦应用程序终止了 vm 释放它的所有资源/关闭它的套接字。
  • 您的Socket 是如何获得的?是否涉及ServerSocket?因为应该有,我们很乐意看到那部分。

标签: java sockets serialization


【解决方案1】:

正在关闭套接字。关闭 Socket 的输入流或输出流会关闭另一个流和套接字。

您可能正在分配多个流。 ObjectOutputStreamObjectInputStream 应该按此顺序构造,在套接字的整个生命周期内一次,而不是每次发送或接收一次。

【讨论】:

    【解决方案2】:

    您需要像第一个示例中那样执行服务器,如果您关闭流,则无法像第二个示例中那样重新打开它。

    问题将出现在您关闭流的任何位置。不管什么原因,它在服务器读取对象之前就关闭了。

    不要忘记您在服务器中有一个while() 循环,而我在您发布的代码中没有看到客户端的循环。是否有可能您成功通过一次,然后服务器尝试再次执行并且客户端断开连接?

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多