在使用蓝牙连接的服务器 - 客户端游戏(GameKit,特别是iOS6兼容性)中,当每个客户端上的按钮被点击时,一个或多个客户端设备(iPhone / iTouch)向服务器设备(iPad)发送时间戳。即每个客户呼叫:
[[NSDate date] timeIntervalSince1970]
...然后将值作为NSData
有效负载发送到服务器。
当仅连接一个客户端时,生成并发送到服务器的时间与物理点击的时间相同。当连接2个或更多客户端时,即使所有客户端都在完全相同的时间点击,生成的时间也会有很大差异,例如
客户端1和2同时点击:
即。客户端2在某种程度上是从客户端1出来的5秒钟。虽然我接受了几毫秒的差异,因为真正的同步攻丝很难,多秒是不可接受的。添加其他客户端会产生或多或少的随机时间差异,但通常会产生几秒钟。
为了使事情更加神秘,时间戳在客户端上以不同的方式生成:服务器上接收的时间戳与客户端生成的时间戳相同(即'不是在运输途中或收货时发生的事情。
我因为导致这种情况而感到茫然。有什么想法吗?
答案 0 :(得分:0)
我的猜测是,无论出于什么原因,这些设备相隔5秒钟
我之所以这样说是
[[NSDate date] timeIntervalSince1970]
通常具有亚毫秒精度
答案 1 :(得分:0)
[[NSDate date] timeIntervalSince1970]
与设备上设置的时间有关,因此您不能依赖两台设备同时向服务器发送。
在使用Multipeer Connectivity开发内容时我遇到了类似的问题,最后使用了一个名为 ios-ntp 的库,该库使用来自多个NTP服务器的时间信息以及请求本身的延迟得出准确的时间。这对我来说非常好。