无法在全双工代码

时间:2016-03-15 07:15:32

标签: java sockets serialization tcp

我正在尝试在两个应用程序之间实现全双工TCP连接。

我的想法是做到以下几点:

客户端

socket.connect(ServerAddress,Timeout);
socketArray.add(socket);
outputStream = new ObjectOutputStream(socket.getOutputStream());
outputStream.writeObject(message);
outputStream.flush();

/** Wait for reply**/
inputStream = new ObjectInputStream(socket.getInputStream());
message     = (Message)inputStream.readObject();

if (message.type == X) {
   replyToServer(message,socketArray);
}  

replyToServer(Message,socketArray) {
  for(Socket socket : socketArray) {
      outputStream = new ObjectOutputStream(socket.getOutputStream());  // **getting streamCorruptedException** here
      outputStream.writeObject(message);
      outputStream.flush();

  }

}

服务器

这里我收听传入的连接,并且根据消息类型,我想在更改消息的某些参数后回复它。

inputStream = new ObjectInputStream(clientSocket.getInputStream()); //notice inputStream and outputStream are created only once here, maybe that is the issue ?
outputStream = new ObjectOutputStream(clientSocket.getOutputStream());
while ( (message = (Message)inputStream.readObject() ) != null) {
  if (message.type == Y) {
     message.type = X ; //notice this is used in Client code
     outputStream.writeObject(message);
     outputStream.flush();           
  } else if (message.type == X ) {
    // don't send anything to client, we are done processing this message
  }
}

在google中查看之后,我知道ObjectInputStream和ObjectOutputStream必须以某种方式同步。但我没有得到具体的理解。如果有人可以在我的代码中指出错误,那将会有所帮助。

代码流程:

  1. 客户端向消息类型为Y的服务器发送消息,要求提供信息。
  2. 服务器看到类型Y,在对象中设置信息,将消息类型更改为X,并回复客户端。
  3. 客户收到所有其他人的回复。 注意:有5个应用程序同时运行服务器和客户端。因此,在继续之前,客户端将等待所有其他人的回复。
  4. 现在,客户端必须将收到的信息发送到所有5个应用程序,并在replyToServer方法中执行此操作。那里发生例外。

    PS:这是伪代码,如果需要更多细节来理解代码流程,请在评论中告诉我。

    实际堆栈跟踪

    err: java.io.StreamCorruptedException
    err: at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1530)
    err:     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1483)
    
    .....`
    

1 个答案:

答案 0 :(得分:0)

outputStream = new ObjectOutputStream(socket.getOutputStream());  // **getting streamCorruptedException** here

不可能。执行StreamCorruptedException: invalid type code AC时,您将在另一端获得new ObjectInputStream(...)

原因是您为同一个套接字创建了多个ObjectOutputStreams,但没有在对等端创建相应的多个ObjectInputStreams。您应该在套接字的两端使用相同的对象输入和输出流。

while ( (message = (Message)inputStream.readObject() ) != null) {

这也无效。 ObjectInputStream.readObject()在流结束时不返回null。它可以在您写入null时返回null。当抛出EOFException时,循环应该终止。