我一直在四处寻找明确的答案,但我似乎总是找到相互矛盾的答案(前this和this)。
基本上,如果我
socket.emit('game_update', {n: 1});
从node.js服务器然后,20毫秒后,
socket.emit('game_update', {n: 2});
来自同一台服务器,是否有任何方式n:2消息在n:1消息之前到达?换句话说,n:1消息"阻止"如果n:1消息在途中以某种方式丢失了,则收到n:2消息?
如果它们是挥发性发射怎么办?我的理解是n:1消息不会阻止n:2消息 - 如果n:1消息被丢弃,那么无论何时消息都会收到n:2消息。
背景:我正在建立一个node.js游戏服务器,希望更好地了解我的游戏更新的方式。我现在正在使用volatile发射器,我想提高服务器的滴答率,但我想确保独立的游戏更新不会相互阻塞。我希望客户端每隔30毫秒收到一次更新,其中散布的更新数据分散在这里,而不是客户端收到更新,200毫秒内没有收到任何更新,然后一次又收到6个更新。
答案 0 :(得分:1)
免责声明:我对socket.io
的内部结构并不完全熟悉。
是否有任何方式n:2消息在n:1消息之前到达?
这取决于您正在使用的运输。对于polling
传输,我认为可以说消息无序到达是完全可能的,因为每条消息都可以通过不同的连接到达。
使用保持持久连接的websocket
传输,可以合理地保证消息顺序。
如果它们是挥发性发射怎么办?
随着波动性的下降,所有的赌注都会被取消,这是一次又一次的冒险。我认为在正常情况下,服务器将等待(并排队消息)以使客户端准备好接收消息,除非这些消息是易失性的,在这种情况下服务器将丢弃它们。
根据你所说的,我认为易失性发射是你想要的,虽然一旦建立了websocket连接,我认为你不会看到所描述的场景(“收到更新,接收没有200毫秒,然后一次又一次接收6个更新“)可能会发生。也许只有当连接丢失并重新建立时。