最近做项目,用到websocket来做消息的实时推送。在做这个项目之前,websocket的相关内容没有接触过,只限于知道有这个东西。对于这个websocket,一切都是从零开始。所以做这个项目前有去搜索了一些关于websocket的技术知识。

        websocket的基本事件有onopenonmessageonerroronclose这四个事件,onopen是连接已打开,且可以通信,onmessage是收到消息,onerror是websocket发生错误,onclose是websocket连接关闭。在这以上的四个事件中,我们做各种事件处理。

        在这次项目中,websocket都能够很好地运行工作,但是今天发现有的手机进入页面后,并且放置一段时间(未关闭页面),再次浏览该页面,会发现该页面收不到来自服务器的推送,一开始我是以为有websocket自带的onclose或onerror的事件,能够检测出来websocket是否在线。后来多次测试后发现websocket其实已经断开连接了,只是浏览器未发现websocket已经断开(也就是响应超时)。实现该现象就是最简单的方法就是页面在PC调试,使用相关软件断开chrome的网络权限,会发现websocket并未能自动检测到已经与服务器断开了连接。

        解决这个问题的办法就是使用心跳检测机制,开始做项目之前,也知道心跳检测机制的存在,但是由于是第一次做,接触websocket不深刻,以为用不到这个。

         心跳检测,用我自己的话来说,就是为了检测客户端与服务端的连接是否能存活

        第一,心跳检测包由客户端(浏览器)定时向服务端(后端)发送约定好的消息格式,告诉服务端客户端在线,服务端收到消息后立即返回一个消息,告诉客户端长连接没问题,可以正常使用。

         第二,心跳检测也可以用来检测后端是否正常,如果在连接正常的情况下,服务端并未能在设定的时间内返回特定消息,说明可能当前后端异常,当前连接不可用,客户端可以尝试重新建立websocket连接来重试。

          实现心跳检测的方法思路算是比较简单,主要是通过定时向服务器send()相关消息,并且定下心跳包的超时时间,当收到服务器返回的消息时,清掉当前心跳计时器以及重连超时的定时器。若服务端未能够及时返回特定消息,超过设定的超时时间时,主动关闭当前websocket连接,并且尝试重新建立新的websocket连接。

以下为我在项目中的部分代码,以供参考:

javafx SocketIOServer 心跳_服务器