正常close,服务器可以检测的到,但是如果前台是WiFi断开,服务器无法检测到,前台websocket已经断开?
这个时候应该去通知服务器,说前台已经断开了连接!
QTD
- 发布:2018-05-22 11:42
- 更新:2018-05-23 10:47
- 阅读:4155
回梦無痕 - 暂停服务
你理解有误,断开WiFi并不会close一个websocket,因为网络不好或者不稳定的情况非常的常见,不能把网络断开视为websocket的close行为.
应该做的是,服务器和客户端用心跳维持链接状态,如果客户端无心跳回应(一次或者多次,或一段时间),然后服务器就主动把这次的连接视为断开。
就像手机通话信号一样,如果正在通话的双方,其中一方没信号了,这次通话不会马上断开,而是一段时间后还是没信号,手机或服务商就主动去挂断本次通话,
QTD (作者)
听您这么一说,那就完全能解释通为什么WiFi断开,服务端没有执行close。我已经在客户端加入了心跳。所以我现在需要在服务端也加入一个心跳对吗?
2018-05-22 16:09
回梦無痕
回复 QTD:...心跳,应该是服务器发出,然后客户端回应。比如,服务器发一个{type:"ping"},然后客户端回一个{type:"pong"},这就完成了一个心跳,实际应用中,在初期后台搭建websocket框架时候(如果websocket的框架是你们写的话),应该是要把心跳封装进去的作为一个统一管理心跳的功能,如果websocket的框架不是你们写,是那开源的框架,那么那些框架一般都已经封装好心跳的功能的,你设置一下就可以了。
2018-05-22 16:15
QTD (作者)
服务端的话就是tomcat的websocket,写了一个服务类,建立连接之后就存到Map,接下来就是onopen、opmessage之类的,查过资料,并没有看到心跳的设置呀?现在的想法是,每隔一段时间后台就主动向前台所有连接发送消息,然后看都接到了那些连接的回执,把没有回执的连接从Map中删除。新手小白,感谢大佬帮助!
2018-05-22 16:33
回梦無痕
回复 QTD:如果不是游戏或者高同步类的项目,心跳间隔可以适当加大,判断是否断线的心跳数也可以适当增多。
2018-05-22 16:46
QTD (作者)
有个问题,客户端的websocket不是本身就不能上时间保持住吗?如果前台不进行心跳的话,如何进行客户端的重连?
2018-05-22 17:19
回梦無痕
回复 QTD:前台如果断开了,会触发前端的close方法,然后可以在close方法中重连
2018-05-22 17:44