我有一个简单的服务器来处理我正在制作的游戏中的玩家坐标。但是,如果我将服务器设置为比每 0.5 秒发送一次坐标更快。
"[[0,(0,0)],[0,(0,0)]]""[[0,(0,0)],[0,(0,0)]]"
有没有办法在服务器尝试再次发送之前“清除”套接字中的数据?
这也不起作用
s.send("")
我有一个简单的服务器来处理我正在制作的游戏中的玩家坐标。但是,如果我将服务器设置为比每 0.5 秒发送一次坐标更快。
"[[0,(0,0)],[0,(0,0)]]""[[0,(0,0)],[0,(0,0)]]"
有没有办法在服务器尝试再次发送之前“清除”套接字中的数据?
这也不起作用
s.send("")
这是通过 TCP 的,对吧?TCP 提供可靠的字节流,但没有消息边界。因此,您永远不应依赖 TCP 在发送者发送数据的“块”中将数据传递给接收者。
在这种情况下,我怀疑您正在观察“Nagle 算法”( http://en.wikipedia.org/wiki/Nagle%27s_algorithm ) 的效果,这是 TCP 中的一种旧优化,可以折叠小型写入。您可以使用 TCP_NODELAY 套接字选项在发送方将其关闭,然后您的测试程序可能会使问题看起来好像已解决。但从根本上说,它不是!总是会发生 TCP 决定以与发送的不同的块的形式传送字节的情况。
使用 TCP,您应该始终使用某种框架来分隔消息。或者,您可以使用面向消息的传输,例如 UDP 或 SCTP,但它们还有其他问题。或者,您使用更高级别的消息队列系统(ZeroMQ、RabbitMQ 等)。