与java中使用TCP的mac相比,windows上的延迟不好
我正在尝试制作一个多人游戏,但在我开始之前,我一直在尝试让一个简单的类似ping的应用程序工作。由于某些原因,我在Windows上的ping时间非常糟糕(400毫秒左右),而如果我在Mac上尝试,它会好得多(8毫秒左右) 我有我的服务器和客户端。服务器使用与java中使用TCP的mac相比,windows上的延迟不好,java,sockets,network-programming,latency,Java,Sockets,Network Programming,Latency,我正在尝试制作一个多人游戏,但在我开始之前,我一直在尝试让一个简单的类似ping的应用程序工作。由于某些原因,我在Windows上的ping时间非常糟糕(400毫秒左右),而如果我在Mac上尝试,它会好得多(8毫秒左右) 我有我的服务器和客户端。服务器使用serverSock.accept()创建一个Socket客户端sock,其中serverSock是端口12234处的另一个Socket。客户端使用另一个套接字在单独的应用程序中连接到我的外部ip端口12234 我的ping基本上只是将客户端上
serverSock.accept()
创建一个Socket客户端sock
,其中serverSock
是端口12234处的另一个Socket
。客户端使用另一个套接字
在单独的应用程序中连接到我的外部ip端口12234
我的ping基本上只是将客户端上当前系统时间的消息发送到服务器,服务器将其发送回服务器,客户端从接收回的时间中减去新的当前时间并打印出来
Java在我试用过的所有计算机上都是最新的(3台windows计算机、2台Mac和一台windows虚拟机)
奇怪的是,Windows虚拟机得到的ping与Mac机相同,为8或9毫秒,而独立Windows机器的ping范围为400毫秒
另一个奇怪的怪癖是,如果我ping得更快,Windows上的ping时间将减少到200毫秒左右
另外,当我在命令行/终端上ping我的外部地址时,windows和mac都大约为1ms
如有任何建议或想法,将不胜感激
提前谢谢 问题已经解决了 事实证明,Windows使用Nagle算法来节省带宽。然而,该算法在实际发送数据包之前设置了200ms缓冲时间 Windows上ping时间缓慢的原因就是这个原因。约400ms的时间是从客户端传出200ms,然后从服务器返回到客户端传出200ms 所有这些问题都可以通过在两端的套接字上调用
setTcpNoDelay()
来解决
Windows和OSX机器是否在同一网络上?Windows系统是否运行某种防火墙?在网络相关的系统之间还有什么不同之处吗?另外,在Windows和OSX上计算延迟的方法是相同的?所有机器都在同一个网络上。我相当肯定Windows机器有防火墙,只是因为它们默认有防火墙,对吗?我不知道windows和mac有什么不同。你能想出其他的诊断工具来测试类似的东西吗?假定java时钟在两个系统上都能工作,那么延迟也是以同样的方式计算的。@JoachimPileborg谢谢你的帮助。我现在明白了。对于高吞吐量和低延迟的游戏,几乎都使用UDP进行与游戏相关的通信。TCP用于聊天等非关键内容,或用于必须交付但没有延迟限制的内容。