我遇到了以下问题。我已经创建了与远程echo服务器的连接。以下方法用于接收从服务器接收的字节:
public byte[] receive() {
byte[] resultBuff = new byte[0];
byte[] buff = new byte[4096];
try {
InputStream in = socket.getInputStream();
int k = -1;
while((k = in.read(buff, 0, buff.length)) != -1) {
System.out.println(k);
byte[] tbuff = new byte[resultBuff.length + k]; // temp buffer size = bytes already read + bytes last read
System.arraycopy(resultBuff, 0, tbuff, 0, resultBuff.length); // copy previous bytes
System.arraycopy(buff, 0, tbuff, resultBuff.length, k); // copy current lot
resultBuff = tbuff; // call the temp buffer as your result buff
String test = new String(resultBuff);
System.out.println(test);
}
System.out.println(resultBuff.length + " bytes read.");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return resultBuff;
}
我可以从服务器获得以下响应:
Connection to MSRG Echo server established
问题是循环在in.read()的第二次执行时卡住了。我知道这是因为服务器没有发送任何EOF信息等。
我不确定以下哪两个解决方案是正确的以及实现它的方式:
来自服务器的每条消息都将通过新执行的receive()方法读取。如何防止in.read()方法阻塞?
在应用程序退出之前,receive()方法中的循环应保持活动状态。这意味着我的实现目前正在使用in.read()错误。应该以何种方式实施。
答案 0 :(得分:1)
这个问题的关键是你使用“消息”这个词。 TCP中没有消息,只有字节流。如果你想要消息,你必须自己实现它们:一次读一个字节,直到你有一个完整的消息,处理它,冲洗并重复。您可以使用BufferedInputStream来分摊单字节读取的成本。
但是echo服务器中没有消息。因此,您的阅读和累积策略是不合适的。只要你收到任何信息就立即回复。