Java套接字readFully()DataInputStream在第二次循环迭代时挂起

时间:2017-03-16 01:30:00

标签: java sockets java-io datainputstream dataoutputstream

这是合约。我要编写一个小客户端/服务器聊天应用程序。限制是我必须在数据包表单下将数据从一个发送到另一个。数据包组成如下: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;

0 个答案:

没有答案