GatewayWorker客户端向服务端发送心跳请求及心跳检测的实现

现在在做一个功能,就是服务端要知道客户端何时掉线的功能,那么要实现这个功能,首先需要实现客户端向服务端发送心跳请求,以及服务端为客户端进行心跳检测的功能。

为了实现这个功能,我选择使用GatewayWorker框架,刚刚接触这个框架,实现了一个简单的客户端心跳检测。

首先,在服务端设置心跳检测:

服务端的心跳检测的设置,需要在start_gateway.php文件中进行设置,start_gateway.php文件是 gateway进程启动脚本,包括端口号等设置。

// 心跳间隔
$gateway->pingInterval = 15;
$gateway->pingNotResponseLimit = 1;
// 心跳数据
$gateway->pingData = '';

代码含义:
(1)$gateway->pingInterval = 15; 心跳检测的时间间隔为15秒

(2)$gateway->pingNotResponseLimit = 1; 心跳检测的时间间隔数

(3)$gateway->pingData = ‘’;服务端定时向客户端发送的数据(暂不考虑)

(4)客户端定时向服务端发送心跳,那么 g a t e w a y − > p i n g N o t R e s p o n s e L i m i t 必 须 要 大 于 0 , 如 果 gateway->pingNotResponseLimit 必须要大于0,如果 gateway>pingNotResponseLimit0gateway->pingNotResponseLimit =0,就表示客户端不向服务端发送心跳,服务端即使没有收到客户端的心跳,也不会断开连接,更不会触发onClose回调函数。

(5)$gateway->pingInterval x $gateway->pingNotResponseLimit 的值,就是心跳时间期限。

(6)上面代码的含义就是在 15(15x1) 秒的时间里,如果服务端没有检测到客户端发送的心跳请求,那么服务端就认为客户端已经掉线了,服务端自动触发onClose回调函数,进行客户端掉线的善后工作。

需要说明的是,在start_gateway.php文件中进行设置的心跳检测,只是相当于一个config的设置操作,并没有实现任何客户端心跳数据的发送,以及服务端心跳数据的接收和心跳停止后所触发的后续功能。只是起到一个心跳检测的设置作用。

在客户端设置心跳请求:

在客户端设置心跳请求,就是在前端页面(浏览器)里编写js代码,通过在html页面中的js代码,实现前端(客户端)发送心跳请求,

先实现了一个简单的心跳请求测试:

<script>
    var ws = new WebSocket("ws://127.0.0.1:8282");
    ws.onopen = function(){
		console.info("与服务端连接成功");
		ws.send('test msg\n');//相当于发送一个初始化信息
		console.info("向服务端发送心跳包字符串");
		setInterval(show,3000);
		}
	
	function show(){
		ws.send('heart beat\n');
		}	
  
  	ws.onConnect = function(e){

		}
	ws.onmessage = function(e){
console.log(e.data);
		}
//心跳处理
//获取会员id
ws.onclose = function(e){
	 console.log(e);
	}
</script>

这个代码很简单,代码解释:
(1) var ws = new WebSocket(“ws://127.0.0.1:8282”); 实例化gatewayworker,
(2)通过onopen属性,与服务端建立连接,

    ws.onopen = function(){
		console.info("与服务端连接成功");
		ws.send('test msg\n');//相当于发送一个初始化信息
		console.info("向服务端发送心跳包字符串");
		setInterval(show,3000);
		}

这里要说的是,客户端与服务端建立连接,我没有在gatewayworker和workerman里找到相应的方法,所以只能用websocket的onopen属性来实现。
(3)在客户端的定时器,采用了setInterval(show,3000);来实现,每3秒执行一次show()函数。
(4)通过show()函数来向服务端发送心跳数据。

	function show(){
		ws.send('heart beat\n');
		}	

服务端心跳请求的处理:
服务端处理心跳,都是在gatewayworker的业务文件——events.php进行的,
这里只写一下onclose函数,就是当gatewayworker检测到客户端心跳停止(比如断电,关闭页面,网线被女朋友拔掉,死机等),就自动触发onclose函数,那么客户端心跳停止后的善后功能,都可以在onclose函数中加以实现,在这个测试案例中,onclose函数实现了发送心跳停止的提示语句。

   /**
    * 当用户断开连接时触发
    * @param int $client_id 连接id
    */
   public static function onClose($client_id)
   {
       // 向所有人发送 
       echo "the heart beats stoped.\n";
       echo "the user logouted.\n";

   }

运行结果:

打开浏览器,打开客户端页面,客户端通过setInterval(show,3000)函数,自动发送心跳请求(向服务端发送heart beat字样的信息),因为客户端是每3秒发送一次心跳,符合服务端心跳检测的15秒内需有心跳的心跳检测规则,所以一切正常,当客户端页面关闭,心跳停止,服务端发现15秒内没有一次心跳,就认为客户端已经下线,自动触发服务端的onclose函数,
在这里插入图片描述

以上就是使用gatewayworker,进行客户端向服务端发送心跳请求,以及服务端进行客户端的心跳检测的简单实现,

这里有几点想要说的是:
(1)gatewayworker为客户端提供的接口或者方法并不多,比如客户端的定时器,客户端向服务端发送信息,以及客户端与服务端进行连接这些功能的实现,都需要使用websocket的属性和方法实现,gatewayworker并没有提供客户端方法的支持。
(2)正因为(1),对于不支持websocket的浏览器,就会产生功能性的问题,所以在后面还需要使用socket.io等库进行浏览器兼容性的处理。
(3)关于gatewayworker的定时器:

        Timer::add(10, function(){
            echo "timer\n";
        });

gatewayworker或者workerman的定时器,都是针对服务端的,这个Timer定时器类,是服务器端定时实现某些功能操作,而跟客户端的定时器无关,所以客户端要实现心跳功能,用不上Timer定时器类啊,还是需要客户端自行编写定时器功能。

评论 4 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

sinat_34469308

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值