三、如何实现心跳?

Voovan 内部实现了一个优雅且低耦合的心跳的支持,使用起来是非常简单的。

  • 1.调用org.voovan.network.HeartBeat心跳类的attachSession方法,将心跳类绑定到一个指定的 Socket 会话(org.voovan.network.IoSession)
  • 2.调用org.voovan.network.HeartBeat心跳类的beat方法进行心跳
  • 3.通过判断调用org.voovan.network.HeartBeat心跳类的getFailedCount()方法的返回值确定心跳失败的次数,进行自己的业务操作,比如重连.下面我们来看代码,以下的代码org.voovan.test.network.ClientHandlerTest的一个片段,在onIdle事件中调用了心跳类,这样我们可以通过空闲事件的触发事件来触发心跳类,具体大家看一下注释吧
  1. @Override
  2. public void onIdle(IoSession session) {
  3. //心跳依赖于 idle 时间,这个参数在构造 socket 的时候设置具体查看 org.voovan.network.aio.AioSocket
  4. //服务端和客户端使用了两种不同的心跳绑定方式,这是其中一种
  5. if(!(session.socketContext() instanceof UdpSocket)) {
  6. HeartBeat heartBeat = session.getHeartBeat();
  7. if (heartBeat == null) {
  8. //心跳绑定到 Session
  9. heartBeat = HeartBeat.attachSession(session, ConnectModel.SERVER, "PINGq", "PONGq");
  10. }
  11. //心跳一次, 返回 true:本次心跳成功, false: 本次心跳失败
  12. System.out.println("==>" + heartBeat.beat(session));
  13. if (heartBeat.getFailedCount() > 5) {
  14. session.close();
  15. }
  16. }
  17. }

心跳附加 session 的部分建议大家在 onConnect 事件中执行,否则可能导致连接刚连上的几个心跳是失败的。