这是合约。我要编写一个小客户端/服务器聊天应用程序。限制是我必须在数据包表单下将数据从一个发送到另一个。数据包组成如下:size(1byte)idClient(5bytes)opCode(1Byte)和消息(1-256bytes) 现在我已经设法在最大256字节的块中剪切消息。并发送它们,但是当消息长于一个数据包时服务器挂起。
所以这是服务器端:
boolean b = true
DataInputStream in = new DataInputStream(socket.getInputStream());
while (true) { // listen to messages from client
while (b) { //listen until all packets are received
int msgLength = in.readInt(); // the length of the message sent
...
...
in.readFully(packet);//size of byte[]packet depend on msgLength (is managed)
...
...
...
}
}
这是客户端: 该方法运行并发送每个数据包的数据
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
while(i < message.length){ //cuts the message into chunks of 256 bytes max
//(the last packet of the message is under 256 all
//the others are 256 bytes)
...
...
out.writeInt(message.length);
out.write(packet);
out.flush();
}
当服务器只在一个数据包中收到消息时,一切都很好。但是当消息更大时,在第二个while循环(始终是服务器端)的第二次迭代中,第一个in.readInt()工作正常,但是in.readFully()等待FOREVER用于应该已经发送的数据。 最糟糕的是,我通过ObjectO / IputStream替换DataO / IputStream一段时间使其工作正常。现在两个都让程序永远等待,如果没有崩溃说:
java.io.StreamCorruptedException: invalid type code: 00
或
java.io.StreamCorruptedException: invalid type code: AC
或
java.io.StreamCorruptedException: invalid header...
请帮助我绝望&gt;&lt;