服务器/客户端如何知道对方已断开连接

时间:2018-09-19 02:10:55

标签: javascript node.js sockets websocket socket.io

我对服务器/客户端如何知道另一个已断开连接并有几个问题感到困惑:

  1. 服务器如何检测到客户端已断开连接,并在服务器端的socket.on('disconnect')中触发功能。与客户端类似,它也具有socket.on('disconnect')将在服务器关闭时在客户端触发。我在服务器上设置了很高的pingInterval和很高的pingTimeout,但是似乎服务器和客户端都可以检测到对方立即断开连接(通过触发on('disconnect')事件)。

  2. 关于ping / pong数据包,双方(服务器和客户端)都将向对方发送“ ping”并等待“ pong”响应返回,或者只有服务器端向客户端发送“ ping”客户端收到“ ping”数据包后,将“ pong”发回服务器。

任何人都知道,请向我解释。非常感谢

1 个答案:

答案 0 :(得分:0)

  

服务器如何检测到客户端已断开连接,并在服务器端的socket.on('disconnect')中触发功能。与客户端类似,它也具有socket.on('disconnect')将在服务器关闭时在客户端触发。我在服务器上设置了非常高的pingInterval和非常高的pingTimeout,但似乎服务器和客户端都可以检测到对方立即断开连接(通过触发on('disconnect')事件)。

由于任何原因关闭TCP连接时,都会检测到常规断开连接。当网页手动关闭socket.io连接或浏览页面离开浏览器并关闭该网页上所有打开的连接时,服务器将关闭TCP连接。因此,当连接正常运行,然后被客户端或服务器关闭时,另一端将立即看到关闭的TCP连接。这与ping或pong间隔无关。这些用于其他用途(如下所述)。

由于TCP套接字仍可以在技术上连接(尚未关闭),但实际上可能无法操作且无法再工作,因此使用ping和pong来确定是否仍然具有这样的开放TCP套接字的连接不再工作。如果发现是这种情况(对方没有从ping / pong处及时得到响应),则关闭套接字,然后生成断开事件。

  

关于ping / pong数据包,双方(服务器和客户端)都将向对方发送“ ping”,并等待“ pong”响应返回,或者只有服务器端向客户端发送“ ping”,然后客户端发送回当服务器收到“ ping”数据包时,将“ pong”发送给服务器。

我在此上找不到任何确定的文档,但是服务器代码似乎希望从客户端接收ping消息,如果在一定时间内未收到ping或其他数据包,它将关闭连接超时时间。服务器一收到ping,就会立即将pong发送回客户端。因此,假设客户端正在发送ping,并在一定时间内寻找pong响应。如果在一定时间内未找到pong响应,则它将在其末端关闭连接(并可能尝试重新连接,具体取决于配置)。