【问题标题】:java: I/O stream in client/server socket causing randomly 300ms delayjava:客户端/服务器套接字中的 I/O 流导致随机 300 毫秒延迟
【发布时间】:2018-03-26 09:47:10
【问题描述】:

我正在处理一些需要在服务器和客户端应用程序之间进行低延迟通信的项目。两者都在我的计算机上运行,​​因此它连接到 localhost。

通过DataInputStreamDataOutputStream的数据传输和socket连接正常工作,99%的时间测量到的ping是0ms或1ms,但有时通信得到随机延迟 300ms。

像网络游戏这样的普通应用程序运行良好,没有任何“滞后”,所以我确信这不是我的计算机的问题。

我发现延迟总是恰好 300 毫秒,而没有发生时,延迟总是 0ms 或 1ms,这很可疑,所以发生了一些事情,但我可以不知道是什么。

我使用时间戳记录,直到发现它在任何服务器和客户端都发生

in.read();

inDataInputStream 所以我假设延迟不是直接在我的代码中。

有人可以向我解释一下,在 Java 中,I/O 流或套接字导致了 300 毫秒的延迟,我该如何解决?我为服务器/客户端更改的唯一内容是

socket.setPerformancePreferences(0, 1, 0);

但这并没有改变任何事情。

我的代码有点大,但服务器和客户端应用程序相关部分的一般结构如下所示:

while(still_alive) {
  out.writeInt(data1);
  out.writeInt(data2);
  out.writeDouble(data3);
  data1 = in.readInt();
  data2 = in.readInt();
  data3 = in.readDouble();
  DoSomethingWithData(data1, data2, data3);
}

提前致谢!

凯斯基

【问题讨论】:

  • 您是否尝试过获取有关正在运行的应用程序的一些统计信息?我的想法之一是可能在 GC 期间发生的 Stop The World 事件。以下是关于如何监控 GC 的参考:cubrid.org/blog/how-to-monitor-java-garbage-collection
  • 我现在已经尝试过了,但似乎没有引起问题 - 还尝试在服务器和客户端上的每个网络框架开始时手动运行 System.gc() - 它增加了测量默认情况下 ping 约 6-8 毫秒,但 in.read() 仍会阻塞 300 毫秒,因此它测量 306-308 毫秒

标签: java sockets networking io latency


【解决方案1】:

我找到了解决办法!

似乎 DataInputStreamDataOutputStream 不适合低延迟网络,但您应该使用 BufferedInputStreamBufferedOutputStream 代替。

使用起来有点困难,因为每个输入都以字节为单位,因此您需要将任何 int、double 和 String 转换为字节数组并将它们转换回来,所以我花了一些时间来做到这一点,但现在它可以完美地工作而无需任何滞后。

【讨论】:

    【解决方案2】:
    socket.setPerformancePreferences(1, 0, 2); // here latency is 0.
    socket.setTcpNoDelay(true); // for client as well as server.
    

    试试这个。它会带来很大的改变。和 DataOutputStream 和 DataInputStream 完美配合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 2012-06-05
      • 1970-01-01
      • 2013-08-08
      • 2017-02-25
      • 2012-06-24
      • 1970-01-01
      相关资源
      最近更新 更多