我正尝试在两个应用程序之间实现全双工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必须以某种方式同步。但我没有得到具体的理解。如果有人可以在我的代码中指出错误,这将会有所帮助。
代码流:
- 客户端将消息发送到与消息Y型服务器,询问信息。
- 服务器看到类型Y,在对象中设置信息,将消息类型更改为X,并回复客户端。
- 客户端收到所有其他人的回复。 注意:有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)
.....`