gpt4 book ai didi

java - 套接字输入流在最终读取时挂起。处理这个的最佳方法?

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:12 26 4
gpt4 key购买 nike

我对如何避免我的套接字在读取时挂起感到有点困惑。这是我的代码:

    Socket socket = new Socket("someMachine", 16003);
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();
try {
outputStream.write(messageBuffer.toByteArray());
outputStream.flush();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer response = new StringBuffer();
int result;
while ((result = in.read()) != -1) {
response.append(Character.toChars(result));
System.out.println(result);
}
System.out.println("Done!"); //never gets printed
} catch (...) {}

上面的代码成功地从流中读取了所有数据,但随后挂起。在网上阅读时,我希望从服务器(我无法控制)收到 -1 以指示我已到达流的末尾,但我却得到了这个:

(Lots of data above this point)
57
10
37
37
69
79
70
10

然后挂起。所以,我的问题是:

1) 是我编码有误还是服务器响应有问题?

2) 如果服务器的响应有问题(即没有返回 -1),我该如何解决这个问题(即当它挂起时停止读取)。

感谢任何帮助!

最佳答案

只在读取会挂起的地方停止的问题是这可能发生在 2 种情况下:

1:服务器没有更多数据要发送

2:服务器发送了更多数据,但由于网络过载,您的客户端尚未收到。

而且你只想在第一种情况下真正停止读取,但在第二种情况下你想要读取阻塞。

解决这个问题的方法是制定一个传输协议(protocol)(标准),允许服务器告诉客户端它希望发送多少数据。

如果服务器事先知道总数据大小,只需先发送传输中的总字节数,然后再发送数据。这样客户端就知道它何时收到了所有数据。

(或者服务器可以在完成后简单地关闭连接。这样read应该会失败,但这只有在您将来不需要连接时才有效)

关于java - 套接字输入流在最终读取时挂起。处理这个的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4886293/

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