2017-02-17 49 views
0

我正在为基于回合的Unity游戏编写node.js websocket后端。这是我第一次使用node.js和websockets,所以我想我会让玩家可以重新连接,并且会得到他们错过的任何消息。Websockets - 自定义排队系统是否有意义?

然后,我开始在游戏中实现它,并想测试我的排队系统,所以我关掉我的互联网连接,并把它背在 - ,惊讶地发现连接躲过了这场,任何错过的消息是通过相同的连接发送。无需重新连接并将积压发送到新连接。

因此,似乎websocket技术已经处理离线排队?通过自己做这些事情来使服务器代码复杂化(并通过将消息保留在那里来增加服务器的内存负载)是否有意义?

另外,它怎么能保持套接字连接没有互联网连接活着?是否有一个标准化的超时时间,或双方都会跟踪它,除非我手动关闭它?

谢谢!

+0

据我所知,你使用socket.io的权利? –

+0

不,我选择直接使用websockets(即require('websocket')。server),因为我不需要socket.io具有的ajax回退。 – SvenM

+0

我在半年前阅读并记录**保证消息传递确认已被证明是不可能的,但TCP保证在给定“无限”重试的情况下执行传送和订单。** 您可以尝试使用Wireshark或类似工具来跟踪套接字并执行一些测试以了解现在的队列如何适用于WebSockets。 –

回答

2

然后,我开始在游戏中实现它,并想测试我的排队系统,所以我关掉我的互联网连接,并把它背在 - ,惊讶地发现连接躲过了这场,任何错过消息通过相同的连接发送。无需重新连接并将积压发送到新连接。

关闭连接不会自动杀人建立了这方面的任何插座。当他们尝试发送数据失败时,套接字最终会关闭,经过多次重试和时间流逝后,他们所得到的都是错误。如果一个套接字没有主动尝试发送任何数据,并且没有任何配置的keep-alive可以自动完成,那么它可能会在一个死连接中呆上几个小时,并且根本不知道连接已经死了。只要套接字没有被使用,就没有自动的方式,它甚至不知道它是端到端连接不再起作用。它只是在它试图使用连接并且得到一个错误时才会发现。

请注意,如果服务器进程崩溃,但连接保持活动状态,则情况会有所不同。在这种情况下,服务器上的TCP堆栈会看到服务器进程崩溃,并尝试清理它正在使用的任何套接字,并将关闭数据包发送到另一端,另一端将主动告知该套接字是关闭。但是,仅仅打乱交通工具的情况并不一样。

所以它看起来像websocket技术已经处理离线排队?通过自己做这些事情来使服务器代码复杂化(并通过将消息保留在那里来增加服务器的内存负载)是否有意义?

websocket是TCP套接字上的协议层。 TCP是一种可靠的传输方式,这意味着当它发送数据时遇到困难(但没有收到任何关于套接字已被另一端关闭的通知),它会挂起并重试数据。它最终会放弃并回传一些错误。

您可能会对socket.io感兴趣,它是webSocket顶层的一个图层。它增加了一些与此处相关的东西:

  1. 定期ping从端到端,以便它知道传输何时中断。
  2. 当插座关闭或运输中断时无缝自动重新连接。
  3. 在连接暂时中断时自动排队发送的数据。

另外,它怎么能保持套接字连接没有互联网连接活着?是否有一个标准化的超时时间,或双方都会跟踪它,除非我手动关闭它?

正如我刚才所说,如果没有端尝试发送数据和互联网连接在两个端点之间的中间某处中断,则可能的WebSocket根本不知道连接当前不起作用。定期知道连接是否有效的唯一方法是通过连接发送数据并查看是否得到及时响应。这是socket.io用它的ping/pong消息所做的。

无论物理连接发生什么,保持逻辑连接的方式都是在物理连接之上使用额外的层(如socket.io在webSocket之上)。这样可以让您拥有可能重新启动物理连接而无需更改逻辑连接的代码。这正是socket.io从客户端所做的事情。如果您希望从服务器端获得类似的东西,您可能需要实现自己想要发送给客户端的数据队列,并且只有在确定它们已成功发送时才从队列中删除。