2016-03-15 18 views
0

我正尝试在两个应用程序之间实现全双工TCP连接。无法更正全双工代码中的StreamCorruptedException

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

客户

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 
    } 
} 

在谷歌环顾四周后,我得到了一些想法,ObjectInputStream和ObjectOutputStream必须以某种方式同步。但我没有得到具体的理解。如果有人可以在我的代码中指出错误,这将会有所帮助。

代码流:

  1. 客户端将消息发送到与消息Y型服务器,询问信息。
  2. 服务器看到类型Y,在对象中设置信息,将消息类型更改为X,并回复客户端。
  3. 客户端收到所有其他人的回复。 注意:有5个应用程序同时运行服务器和客户端。因此,客户在继续之前会等待所有其他人的回复。

现在客户端必须将接收到的信息发送给所有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) 

.....` 

回答

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

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

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

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

这也是无效的。 ObjectInputStream.readObject()在流结束时不返回空值。任何时候你写一个null都可以返回null。当抛出EOFException时,循环应该终止。