100分求救!!socket的InputStream.readyFully(byte[] b)一直阻塞不能返回??
1.某些时候,socket取得的InputStream.readFully在收到6个字节的头之后,接收剩余字节时,readFully方法好像一直阻塞,而服务端已经发送成功。。
而有时又是好的。。
2.发送时每次抓包看到都是一个包分两次发,第一次只发1个字节,剩下的再一次发完。
没有设置接收缓冲和发送缓冲,也没有设置其他的任何socket选项。。有一个专门的接收线程,收到一个整包后放入一个队列中。。
郁闷啊。。
代码如下:
logger.info("######## ClientSocketFacade Thread start...");
while (connected) {
// logger.info("Tsapi start receiving packet from server");
try {
logger.debug("Begin receiving: " + System.currentTimeMillis());
if(!atomicBool.get()) {
try {
lock.lock();
if (cond != null && atomicBool != null) {
atomicBool.set(true);
if (lock.hasWaiters(cond)) {
cond.signalAll();
}
logger.debug("Wakeup invoker thread.");
}
} finally {
lock.unlock();
}
}
logger.debug("After unlock.");
// 接收6个字节的头
byte[] msgHeader = new byte[6];
this.input.readFully(msgHeader);
MessageHeader mh = new MessageHeader(new LEDataInputStream(msgHeader), null);
mh.receive();
logger.debug(mh);// 这个地方能打印出来
if (mh.getTag1() != TsapiConstants.MESSAGE_TAG1 || mh.getTag2() != TsapiConstants.MESSAGE_TAG2) {
logger.error("Invalid message from tsapi server");
continue;
}
// 接收固定长度的数据封装成流
byte[] content = new byte[mh.getLength()];
this.input.readFully(content);// 比如头是6个字节,包体的长度为100字节,这个地方有时候就一直阻塞,不返回,导致接收线程一直阻塞,而服务端显示已经发送成功了。。
EventWrapper eventWrapper = new EventWrapper(mh, content);
// modified by lvyf 2006.10.24
// 用concurrent包中的阻塞队列
this.streamAdapter.getEventQueue().offer(eventWrapper);
logger.debug("Receive bytes: " + content.length);
logger.debug("End received: " + System.currentTimeMillis());
} catch (IOException e) {
logger.fatal("run() - Receive message from tsapi server failed", e);
this.close();
this.invokeListeners();
break;
}
}