gpt4 book ai didi

java - InputStream接收方法阻塞

转载 作者:行者123 更新时间:2023-12-01 13:55:23 24 4
gpt4 key购买 nike

我遇到了以下问题。我已经创建了到远程回显服务器的连接。以下方法用于接收从服务器接收到的字节:

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 信息等。

我不确定以下两个解决方案中哪一个是正确的以及以何种方式实现它:

  1. 来自服务器的每条消息都将由新执行的 receive() 方法读取。如何防止 in.read() 方法阻塞?

  2. receive() 方法内的循环应保持 Activity 状态,直到应用程序退出。这意味着我的实现当前使用 in.read() 是错误的。应该以什么方式实现。

最佳答案

这个问题的关键是你对“消息”这个词的使用。 TCP中没有消息,只有字节流。如果您想要消息,您必须自己实现它们:一次读取一个字节,直到获得完整的消息,处理它,冲洗并重复。您可以使用 BufferedInputStream 分摊单字节读取的成本。

但是回显服务器中没有消息。因此你的阅读和积累策略是不合适的。只要立即回显您收到的任何内容即可。

关于java - InputStream接收方法阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19659952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com