判断用户是否在线的一般手段是要求用户隔一段时间发送keep alive消息以表明自己还活着,且与服务器之间的连接正常。如果超过一段时间没有收到用户(客户端)发来的keep alive消息,则可以认为这个用户离线了。

Keep alive的使用在TCP协议中已有体现,不过目的是在连接空闲时、链路上没有数据传送时,探测连接是否仍然可用:一方可以隔一段时间发送一个不带载荷的TCP数据包,而另一方在收到keep alive包后应该回复确认包,这样就可以确认连接仍然可用了。

TCP是传输层协议,而在应用层,应用可以主动发送自己定义的keep alive消息,而根据所使用的应用层协议,主动在应用层发送keep alive消息的一方可以要求另一方立刻也在应用层回复一个确认消息,或者不用回复。例如HTTP协议,客户端可以隔一段时间就向服务器发送一个keep alive请求以表存活,而服务器可以不需要在应用层额外回复相应的确认消息,因为一个HTTP请求的完成必然是需要服务器参与的,一旦请求完成,客户端就知道服务器已经收到它的请求了。

而如果你使用WebSocket,它实际上是直接在TCP协议之上的。根据其特性,用户可以与服务器保持长连接,一旦连接断开,你就可以认为客户端离线了。不过默认的配置可能需要一段时间才能反应过来客户端实际上已经意外断开连接了;如果你需要快速的知道客户端是否在线,就可以主动(在应用层)发送keep alive包并要求立刻回复确认,如果另一方没有立刻确认,就认为另一方已离线,并主动断开连接以防止另一方突然又重连回来。

现在使用得比较多的是socket.io,socket.io会帮你发送keep alive包,所以如果你使用socket.io,你就只要关心客户端的连接是否还处于连接状态就行了。