我正在为一个基于回合制的Unity游戏编写一个node.js websocket后端。这是我第一次使用node.js和websockets,所以我想我会让玩家重新连接,并获得他们错过的任何消息。
然后我开始在游戏中实现它,并且想要测试我的排队系统,所以我关闭了我的互联网连接并将其重新打开 - 并且惊讶地发现连接幸免于此,并且发送了任何错过的消息通过相同的连接。无需重新连接并将待办事项发送到新连接。
所以似乎websocket技术已经处理了离线排队?通过自己执行此操作来复杂化服务器代码甚至是有意义的(并通过将消息保存在那里来增加服务器的内存负载)?
此外,如何在没有互联网连接的情况下保持套接字连接存活?是否有标准化的超时,或者双方是否会跟踪它,除非我手动关闭它?
谢谢!
答案 0 :(得分:3)
然后我开始在游戏中实现它,并且想要测试我的排队系统,所以我关闭了我的互联网连接并将其重新打开 - 并且惊讶地发现连接幸免于此,并且发送了任何错过的消息通过相同的连接。无需重新连接并将待办事项发送到新连接。
关闭连接不会自动终止通过该连接建立的任何套接字。当套接字尝试发送数据失败时,它们最终会被关闭,经过多次重试和时间过后,它们所得到的只是错误。如果套接字没有主动尝试发送任何数据并且没有任何类型的keep-alive配置可能会自动执行此操作,那么它可能会在那里停留几个小时并且连接断开并且根本不知道连接已经死亡。只要没有使用套接字,就没有自动方式,它甚至知道它的端到端连接不再起作用。只有当它试图使用连接并得到一个错误,它才能解决这个问题。
注意,如果服务器进程崩溃,但连接保持活动状态会有所不同。在这种情况下,服务器上的TCP堆栈将看到服务器进程崩溃,并将尝试清理它正在使用的任何套接字,并将密切数据包发送到另一端,另一端将主动告知套接字是关闭。但是,你只是破坏运输的情况也不一样。
所以似乎websocket技术已经处理了离线排队?通过自己执行此操作来复杂化服务器代码甚至是有意义的(并通过将消息保存在那里来增加服务器的内存负载)?
websocket是TCP套接字之上的协议层。 TCP意味着是一种可靠的传输,这意味着当它在发送数据时遇到问题(但是没有收到任何类型的通知,说明套接字已被另一端关闭),它会依赖于该数据并重试。它最终会放弃并回复一些错误。
您可能对socket.io感兴趣,它是webSocket上的一个层。它增加了一些相关的东西:
此外,如何在没有互联网连接的情况下保持套接字连接存活?是否有标准化的超时,或者双方是否会跟踪它,除非我手动关闭它?
正如我之前所说,如果两端都没有尝试发送数据并且互联网连接在两个端点之间的中间某处中断,则webSocket可能根本不知道连接当前不起作用。定期了解连接是否正常的唯一方法是通过连接发送数据,看看是否得到及时的响应。这就是socket.io对ping / pong消息的作用。
无论物理连接发生什么,保持逻辑连接处于活动状态的方法是在物理连接的顶部使用额外的层(如在webSocket之上使用socket.io)。然后,这允许您拥有可能在不更改逻辑连接的情况下重新启动物理连接的代码。这正是socket.io从客户端做的事情。如果您想从服务器端获得类似的东西,您可能需要实现自己要发送给客户端的数据队列,并且只有在确定已成功发送时才从队列中删除内容。 / p>