【发布时间】:2018-03-26 09:47:10
【问题描述】:
我正在处理一些需要在服务器和客户端应用程序之间进行低延迟通信的项目。两者都在我的计算机上运行,因此它连接到 localhost。
通过DataInputStream和DataOutputStream的数据传输和socket连接正常工作,99%的时间测量到的ping是0ms或1ms,但有时通信得到随机延迟 300ms。
像网络游戏这样的普通应用程序运行良好,没有任何“滞后”,所以我确信这不是我的计算机的问题。
我发现延迟总是恰好 300 毫秒,而没有发生时,延迟总是 0ms 或 1ms,这很可疑,所以发生了一些事情,但我可以不知道是什么。
我使用时间戳记录,直到发现它在任何服务器和客户端都发生
in.read();
in 是 DataInputStream 所以我假设延迟不是直接在我的代码中。
有人可以向我解释一下,在 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