服务端设计心跳包的目的,网上炒了一段,如果想要仔细了解的同学可以去搜寻一下对应的资料
- 探知对端应用是否存活,服务端客户端都可以发心跳包,一般都是客户端发送心跳包,服务端用于判断客户端是否在线,从而对服务端内存缓存数据进行清理(玩家下线等);问题在于,通过TCP四次握手断开的设定,我们也是可以通过Socket的read方法来判断TCP连接是否断开,从而做出相应的清理内存动作
1.话不多说上代码,服务端代码
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 26 27
| //创建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.客户端代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| //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程序的进程