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

baacloud免费翻墙vpn注册使用

来源: (1条消息) GatewayWorker客户端向服务端发送心跳请求及心跳检测的实现_sinat_34469308的博客-CSDN博客

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

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

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

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

// 心跳间隔
$gateway->pingInterval = 15;
$gateway->pingNotResponseLimit = 1;
// 心跳数据
$gateway->pingData = ”;
1
2
3
4
5
代码含义:
(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−>pingNotResponseLimit必须要大于0,如果gateway->pingNotResponseLimit =0,就表示客户端不向服务端发送心跳,服务端即使没有收到客户端的心跳,也不会断开连接,更不会触发onClose回调函数。

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

(6)上面代码的含义就是在 15(15×1) 秒的时间里,如果服务端没有检测到客户端发送的心跳请求,那么服务端就认为客户端已经掉线了,服务端自动触发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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
这个代码很简单,代码解释:
(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);
}
1
2
3
4
5
6
这里要说的是,客户端与服务端建立连接,我没有在gatewayworker和workerman里找到相应的方法,所以只能用websocket的onopen属性来实现。
(3)在客户端的定时器,采用了setInterval(show,3000);来实现,每3秒执行一次show()函数。
(4)通过show()函数来向服务端发送心跳数据。

function show(){
ws.send(‘heart beat\n’);
}
1
2
3
服务端心跳请求的处理:
服务端处理心跳,都是在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”;

}
1
2
3
4
5
6
7
8
9
10
11
运行结果:

打开浏览器,打开客户端页面,客户端通过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”;
});
1
2
3
gatewayworker或者workerman的定时器,都是针对服务端的,这个Timer定时器类,是服务器端定时实现某些功能操作,而跟客户端的定时器无关,所以客户端要实现心跳功能,用不上Timer定时器类啊,还是需要客户端自行编写定时器功能。
————————————————
版权声明:本文为CSDN博主「sinat_34469308」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_34469308/article/details/83757183

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏