gpt4 book ai didi

java - 如何可靠地判断 Java 中的套接字何时完成读取?

转载 作者:太空宇宙 更新时间:2023-11-04 08:50:40 25 4
gpt4 key购买 nike

我们正在与外部产品集成,该产品需要我们使用 Java 套接字与其进行通信。我们已经能够毫无问题地从服务器读取较小的响应,但较大的响应会引起一些麻烦。
我对套接字处理逻辑做了一些更改,现在我们似乎能够在 90% 的时间内读取大量响应。偶尔还是会失败。在这种情况下,失败意味着 Java 客户端在读取整个响应之前停止从套接字读取。客户端认为读取操作已完成,并正常停止 - 不涉及异常或超时。
当前逻辑如下:

StringWriter response = new StringWriter();
PrintWriter writer = new PrintWriter(response);

char[] buf = new char[4096];
int readChars;
do {
readChars = responseBufferedReader.read(buf);
writer.write(buf, 0, readChars);
} while(readChars != -1 && responseBufferedReader.ready());

responseBufferedReader 是一个包裹在 InputStreamReader 周围的 BufferedReader,而 InputStreamReader 包裹在 SocketInputStream 周围。
此代码在大多数情况下都有效,但检查 readChars != -1ready() 似乎不够可靠,无法指示我们是否已从服务器读取所有内容。将读取的字符数与缓冲区大小进行比较也不可靠,因为服务器发送响应的速度似乎有点慢,导致这些数字不同。
我尝试过更改字符缓冲区的大小;它有帮助,但仍然没有 100% 有效。
是否有更好、更可靠的方法可以在不知道预期响应大小的情况下完全从 Socket 读取数据?我一直在对 SocketChannel 进行一些研究,但我不确定切换是否有任何好处。
如果有帮助的话,我们将建立一个与服务器的阻塞Socket连接。 Socket 配置为 100 秒超时

最佳答案

您不应该检查 BufferedReader 是否已准备好()来判断是否完成。有可能仍在从线路上读取字节,并且 BufferedReader 对您没有任何帮助,但 Socket 尚未关闭。

我不确定 BufferedReader 能为您带来什么值(value)(好吧,它可能有助于您的性能)。我希望以下内容能够更好地发挥作用:

StringWriter response = new StringWriter();
PrintWriter writer = new PrintWriter(response);

char[] buf = new char[4096];
int readChars;
do {
readChars = inputStreamReader.read(buf);
writer.write(buf, 0, readChars);
} while(readChars != -1);

我认为,当网络成为瓶颈时,您可能会退出循环 - 循环处理结果的速度足够快,因此 Reader 尚未准备好,并且您假设您已完成阅读(即使您还没有)。

关于java - 如何可靠地判断 Java 中的套接字何时完成读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3408698/

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