gpt4 book ai didi

java - 设置了超时的套接字有时会在读取时停止

转载 作者:行者123 更新时间:2023-12-02 00:37:00 24 4
gpt4 key购买 nike

我有一个 Java 客户端(Windows XP 上的 1.6b17,通过 Java Webstart 启动),它使用 TCP 套接字通过 ADSL 连接查询基于 Java 的服务器。客户端套接字设置了超时(3000 毫秒)。

偶尔(到目前为止,无法重现)客户端在从服务器读取响应时会停止。有几百个安装,大多数用户大多数时候都不会遇到这个问题。

客户端按照以下步骤为每个请求创建一个新的套接字:

  1. 创建一个新套接字,将超时设置为 3000ms
  2. 提交请求(单行文本)
  3. 读取多行响应,当收到特殊的“消息结束”序列(或空值)时关闭套接字

这里有一些(简化的)代码来说明:

socket = new Socket(host, port);
socket.setSoTimeout(socketTimeout);

out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

socket.write(cmd);

while (true) {

line = in.readLine();

if (line == null) break;

if (line.equals("EOL")) break;

// Store line of text in an ArrayList
}

socket.close();

问题是,有时,在接收过程中,客户端会暂停长达 5 分钟,然后在没有任何干预的情况下恢复。此后,应用程序恢复,没有明显的性能问题。

服务器端的日志记录表明该操作大约需要 150 毫秒,尽管有问题的时间戳是在关闭套接字之前获取的(我将尝试解决这个问题)。

我的工作假设之一是,这不是由于网络问题造成的,否则 readLine 会超时,这是一个有效的假设吗?

这似乎也不太可能与垃圾收集相关。该应用程序分配给堆的空间为 512MB,而检索的数据由大约 1600 行、每行 100 个字符组成。我的期望是,如果问题与 GC 或内存泄漏相关,那么性能会普遍下降,而不是我看到的那种“粘性”行为,这是正确的吗?

任何解决此问题的建议策略将不胜感激。

谢谢,菲尔

最佳答案

我没有看到你有长达 5 分钟的“停顿”。我只能想象你对数据包进行了大量的重试。你应该能够用wireshark看到类似的东西。如果是其他东西,它也可以给你一个线索。

512 MB 堆上的完整 GC 暂停时间应约为 0.5 秒(非常大约)

<小时/>

如果您的连接不可靠,我不建议使用 PrintWriter。如果它收到 IOException,它会设置一个标志而不是抛出异常。如果您继续使用它,它不会起任何作用。

关于java - 设置了超时的套接字有时会在读取时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7558350/

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