服务端设计心跳包的目的,网上炒了一段,如果想要仔细了解的同学可以去搜寻一下对应的资料
探知对端应用是否存活,服务端客户端都可以发心跳包,一般都是客户端发送心跳包,服务端用于判断客户端是否在线,从而对服务端内存缓存数据进行清理(玩家下线等);问题在于,通过TCP四次握手断开的设定,我们也是可以通过Socket的read方法来判断TCP连接是否断开,从而做出相应的清理内存动作
1.话不多说上代码,服务端代码
//创建Server对象,监听 127.0.0.1:9501 端口
$server = new Swoole\Server('127.0.0.1', 9501);
$server->set([
'heartbeat_idle_time' => 3, // 表示一个连接如果3秒内未向服务器发送任何数据,此连接将被强制关闭
'heartbeat_check_interval' => 2, // 表示每2秒遍历一次
]);
//监听连接进入事件
$server->on('Connect', function ($server, $fd) {
echo "Client: Connect.\n";
});
//监听数据接收事件
$server->on('Receive', function ($server, $fd, $from_id, $data) {
$server->send($fd, "Server: " . $data);
});
//监听连接关闭事件
$server->on('Close', function ($server, $fd) {
echo "Client: Close.\n";
});
//启动服务器
$server->start();
2.客户端代码
//new对象
$client = new Swoole\Client(SWOOLE_SOCK_TCP );
//建立tcp连接
if (!$client->connect('127.0.0.1', 9501, -1)) {
exit("connect failed. Error: {$client->errCode}\n");
}
//定时器每4千毫秒执行一次
swoole_timer_tick(4000, function ($timer_id) use ($client) {
echo "string\n";
//发送消息
$client->send(1);
//接收消息
$client->recv();
});
注意使用sleep()函数会影响定时器的执行,因为sleep函数会阻碍整个php程序的进程
转载地址:https://cdhihi.github.io/2020/11/08/swoole_tcp_timer/