Swoole长连接异步服务端
- 1、构建server对象
- 2、基础设置
- 3、基本常用的事件调用
- 0、连接事件
- 1、接收事件
- 2、关闭事件
- 3、开始启动服务端
- 4、结合上一节,操作一下基本的效果
- 0、开启客户端
- 1、开启客户端(这里我这里用的是最新版本的swoole,会有版本中的warring提示,这是没有大问题的)
- 5、友情提示:这里用的xShell 工具进行的模拟操作。
1、构建server对象
$server = new Swoole\Server("0.0.0.0", 9800);
这里的IP地址设置为 0.0.0.0 ,允许任何客户端的请求,但是端口规定是9800(端口也是自定义的,但必须填写,不是某个协议规定的端口)
2、基础设置
$server->set([
'worker_num'=>1,
'open_length_check'=>1,
'package_length_type'=>'N',
'package_length_offset'=>0,
'package_body_offset'=>4,
'package_max_length'=>1024*1024*2
]);
这里和上一节的客户端差不多。
0、worker_num work进程数
1、open_length_check 开启长度检测
2、package_length_type 设置包头的长度
3、package_length_offset 包头长度从哪儿开始计算
4、package_body_offset 包体从第几个字节开始计算
5、package_max_length 包体的最大长度
3、基本常用的事件调用
0、连接事件
$server->on('connect', function ($server, $fd) {
echo '新的连接'.$fd.PHP_EOL;
});
1、接收事件
$server->on('receive', function (swoole_server $server, int $fd, int $reactor_id, string $data) {
$msg = unpack('N', $data);
var_dump(substr($data, 4));
$server->send($fd,$data);
$server->send($fd,$data);
});
在接收事件中,开始进行数据的解包,并打印(var_dump)得到包体;
然后进行服务端向客户端发送数据,这里在上一节的客户端的接收事件的回调函数里面,也进行了打印。
2、关闭事件
$server->on('close', function () {
echo '关闭'.PHP_EOL;
});
3、开始启动服务端
$server->start();
4、结合上一节,操作一下基本的效果
完整的异步长连接的客户端、服务端就可以了。
0、开启客户端
1、开启客户端(这里我这里用的是最新版本的swoole,会有版本中的warring提示,这是没有大问题的)
客户端一运行便看到这些提示,基本情况就是最新版本有一些更新的问题。这里稍后在做具体说明,今天就关注这个异步长连接的效果再来看一下服务端的情况:
第一个:就是服务端的连接事件的回调中打印的,证明客户端连接上了这个服务端;
第二个:就是服务端的接收事件的回调中打印的,证明接受到了客户端发过来的数据;
第三个:这里就是心跳检测,证明长连接的状态了。
接下来:
就可以明白,客户端已开启的时候打印的字符串 ’rommer‘,是哪里来的了?这是服务端的接收事件中,我们用了一行向客户端发送数据的代码:
$server->send($fd,$data);
这样就完整了。
5、友情提示:这里用的xShell 工具进行的模拟操作。
都是在我的服务器上运行的。
如果你没有购买服务器,你可以在网上学习一下,用虚拟机的桥接模式,结合这个xShell,来做这样的学习操作。我就不赘述了。