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、开启客户端

第7节、Swoole长连接异步服务端_Swoole

1、开启客户端(这里我这里用的是最新版本的swoole,会有版本中的warring提示,这是没有大问题的)

第7节、Swoole长连接异步服务端_Swoole_02


客户端一运行便看到这些提示,基本情况就是最新版本有一些更新的问题。这里稍后在做具体说明,今天就关注这个异步长连接的效果再来看一下服务端的情况:

第7节、Swoole长连接异步服务端_长连接_03


第一个:就是服务端的连接事件的回调中打印的,证明客户端连接上了这个服务端;

第二个:就是服务端的接收事件的回调中打印的,证明接受到了客户端发过来的数据;

第三个:这里就是心跳检测,证明长连接的状态了。

接下来:

就可以明白,客户端已开启的时候打印的字符串 ’rommer‘,是哪里来的了?这是服务端的接收事件中,我们用了一行向客户端发送数据的代码:

$server->send($fd,$data);

这样就完整了。

5、友情提示:这里用的xShell 工具进行的模拟操作。

都是在我的服务器上运行的。

如果你没有购买服务器,你可以在网上学习一下,用虚拟机的桥接模式,结合这个xShell,来做这样的学习操作。我就不赘述了。