作为一种双工通讯的协议,websocket在服务端与客户端保持一个长链接,但当我们使用nginx等反向代理中间件时,每隔60秒左右会检查长链接的活动状态,当在一个60秒的周期内没有通讯(发送数据)是,链接会被断开。所以使用websocket必须实现一种定期检测机制,在tomcat-websocket和spring-websocket中,都提供了Ping-Pong消息。
工作过程是:1、服务端发送PingMessage,2、浏览器接受后自动回复一条PongMessage;3、服务端在OnMessage方法中,处理PongMessage(一般来讲不需要做任何操作)。只有这样才能保持链接处于alive状态。
在工作中,我曾经使用定时发送TextMessage到客户端,如果客户端不重新发送回来,则协议上仍认为只是单向连接相通的,Nginx仍会掐断连接。
综上,为了简单起见,何不直接使用浏览器的方案呢?