我正在尝试在两个应用程序之间实现全双工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必须以某种方式同步。但我没有得到具体的理解。如果有人可以在我的代码中指出错误,那将会有所帮助。
代码流程:
现在,客户端必须将收到的信息发送到所有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 :(得分: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
时,循环应该终止。