近期使用go 开发聊天室,使用到websocket常链接。
if err = websocket.JSON.Receive(ws,&reply); err != nil { log.Println(err) return }
我发现当连接断开的时候会走if里面,输出eof
这样就知道,客户端断开了连接。
但在之前使用workerman 中发现其中有一块是《心跳机制》,这个心跳机制也是判断链接是否断开。
所以我就觉得判断链接是否断开了,这个功能是不是重复了。或者心跳机制是不是多余的。(个人理解)
先说下我查阅资料得到的对心跳机制的理解
心跳机制是客户端,自己发送心跳包给服务端来检测链接是否正常。大致方法是在客户端写一个定时器,定时向服务端发送一个短小精悍的包。然后服务端接收到包再返回给客户端一条信息。每次一套:客户端发送包->服务端接收返回相应->客户端接受相应;正常执行,表示该链接正常。否则则认为断线。
心跳包会像心跳一样每隔固定时间发送一次。
理解来源:http://www.codeweblog.com/socket%E5%BF%83%E8%B7%B3%E5%8C%85%E6%9C%BA%E5%88%B6/
对于服务端中获取断线输出eof和心跳机制个人理解
可能是如果只是通过服务端来判断链接是否正常,是不稳定的,或者只通过服务端判断链接是否正常的话无法控制客户端断线后的提示、操作。所以在客户端也需要一个心跳机制,双重判断链接是否正常。这样当链接断开后,服务端可以有操作(删除服务端在线列表中该用户等),客户端也可以有操作(重新发送登录请求,或提示用户等),这样既可以保证程序的正常使用,也可以提高用户体验。
个人观点!