我创建了一个ServerSocket并从不同的客户端读取消息。其中一位客户坚持认为我的应用程序在发送邮件后行为不正确。我设法得到一个TCP跟踪,看到他们真的发送了他们的消息,但我的服务器应用程序没有从套接字读取任何数据。我得到一个线程转储,一切似乎都没问题:
"Reader Thread" daemon prio=3 tid=0x0ae8a000 nid=0x999 runnable [0x14525000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
我无法从流中读取消息的原因是什么?顺便说一下,其他客户不会遇到这种问题。
private byte[] readByte(int readCount) throws Exception {
int b;
int readedCount = readCount;
byte[] receiveBuffer = new byte[readCount];
while( true ) {
if( readCount > 0 ) {
b = inputStream.read(receiveBuffer, readCount - readedCount, readedCount);
} else {
b = 0;
}
if( b < 0 ) {
throw new UnrecoverableSocketException("Connection is Broken");
} else {
readedCount = readedCount - b;
}
if( readedCount == 0 ) {
return receiveBuffer;
}
}
}
答案 0 :(得分:1)
readCount
可能与流上实际可用的数据量不匹配。如果你的客户端发送了10个字节,但是你期望12个代码将被卡住,等待这两个额外的字节。
答案 1 :(得分:0)
您的大多数readByte()方法都可以使用DataInputStream.readFully()实现,并且您将获得数百万倍的测试量。