我正在开展一些需要在服务器和客户端应用程序之间进行低延迟通信的项目。两者都在我的计算机上运行,因此它连接到localhost。
通过 DataInputStream 和 DataOutputStream 进行数据传输,套接字连接正常工作,99%的时间测量ping为0ms或1ms,但有时通信得到随机延迟300ms。
像网络游戏这样的普通应用程序在没有任何" lagspikes"的情况下运行良好,所以我确定它不是我的电脑的问题。
我发现延迟总是正好是300ms 非常可疑,当它没有发生时 0ms或1ms ,所以发生了一些事情,但我可以不知道是什么。
我使用时间戳记录,直到找出它在服务器和客户端的任何一个
上发生in.read();
DataInputStream 所以我假设延迟不是直接在我的代码中。
有人可以向我解释一下,在Java中,I / O流或套接字导致300ms延迟,我该如何解决?我为服务器/客户端唯一更改的是
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);
}
提前致谢!
Kaisky
答案 0 :(得分:0)
我找到了解决方案!
似乎 DataInputStream 和 DataOutputStream 不适合低延迟网络,但您应该使用 BufferedInputStream 和 BufferedOutputStream 而不是。
使用起来有点困难,因为每个输入都是以字节为单位,所以你需要将任何int,double和String转换成字节数组并将它们翻译回来,所以我花了一些时间才能做到这一点,但现在它完美无缺滞后。
答案 1 :(得分:0)
socket.setPerformancePreferences(1, 0, 2); // here latency is 0.
socket.setTcpNoDelay(true); // for client as well as server.
尝试一下。它将带来巨大的变化。并且DataOutputStream和DataInputStream与之完美配合。