QTD
QTD
  • 发布:2018-05-22 11:42
  • 更新:2018-05-23 10:47
  • 阅读:4040

app使用websocket,在断开WiFi的情况下,服务端不能检测到?

分类:HTML5+

正常close,服务器可以检测的到,但是如果前台是WiFi断开,服务器无法检测到,前台websocket已经断开?
这个时候应该去通知服务器,说前台已经断开了连接!

2018-05-22 11:42 负责人:无 分享
已邀请:
回梦無痕

回梦無痕 - 暂停服务

你理解有误,断开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

o***@anvaa.com

o***@anvaa.com

楼上说得对

该问题目前已经被锁定, 无法添加新回复