swoole入门教程05-Swoole的自定义协议功能的使用

环境说明: 系统:Ubuntu14.04 (安装教程包括CentOS6.5)
PHP版本:PHP-5.5.10
swoole版本:1.7.8-alpha


1.为什么要提供自定义协议

熟悉TCP通信的朋友都会知道,TCP是一个流式协议。客户端向服务器发送的一段数据,可能并不会被服务器一次就完整的收到;客户端向服务器发送的多段数据,可能服务器一次就收到了全部的数据。而实际应用中,我们希望在服务器端能一次接收一段完整的数据,不多也不少。传统的TCP服务器中,往往需要由程序员维护一个缓存区,先将读到的数据放进缓存区中,然后再通过预先设定好的协议内容,来区分一段完整数据的开头、长度和结尾,并将一段完整的数据交给逻辑部分处理。这就是自定义协议的功能。
而在Swoole中,已经在底层实现了一个数据缓存区,并内置好了几个常用的协议类型,直接在底层做好了数据的拆分,保证了在onReceive回调函数中,一定能收到一个(或数个)完整的数据段。数据缓存区的大小可以通过配置选项package_max_length来控制。下面我就将讲解如何使用这些内置协议。

2.EOF标记型协议

第一个比较常用的协议就是EOF标记协议。协议的内容是通过规定一个一定不会出现在正常数据中的字符或者字符串,用这个来标记一段完整数据的结尾。这样,只要发现这个结尾,就可以认定之前的数据已经结束,可以开始接收一个新的数据段了。
在Swoole中,可以通过open_eof_checkpackage_eof两个配置项来开启。其中,open_eof_check指定开启了EOF检测,package_eof指定了具体的EOF标记。通过这两个选项,Swoole底层就会自动根据EOF标记来缓存和拆分收到的数据包。示例如下:

$this->serv->set(array(
    'package_max_length' => 8192,
    'open_eof_check'=> true,
    'package_eof' => "\r\n"
));

就这样,swoole就已经开启了EOF标记协议的解析。那么让我们来测试一下效果:
服务器这边:

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
think-swoole 是一个基于 Swoole 扩展的 PHP 框架,它提供了对 WebSocket 的支持。下面是一个简单的示例: ```php // 定义 WebSocket 控制器类 namespace app\index\controller; use think\swoole\WebSocket; class Chat extends WebSocket { protected $server; // WebSocket 连接建立时触发的事件 public function onOpen($server, $request) { $this->server = $server; $this->send($request->fd, 'Welcome to Chat Room!'); } // WebSocket 接收到消息时触发的事件 public function onMessage($server, $frame) { $data = $frame->data; foreach ($server->connections as $fd) { $this->send($fd, $data); } } // WebSocket 连接关闭时触发的事件 public function onClose($server, $fd) { echo "client-{$fd} is closed\n"; } } ``` 在上面的代码中,我们定义了一个名为 Chat 的 WebSocket 控制器类,它继承了 think\swoole\WebSocket 类,并实现了三个事件方法 onOpen、onMessage 和 onClose。在 onOpen 方法中,我们向客户端发送了一条欢迎信息;在 onMessage 方法中,我们将接收到的消息发送给所有连接的客户端;在 onClose 方法中,我们输出了客户端关闭的信息。 接下来,在路由配置文件中定义 WebSocket 路由: ```php // 定义 WebSocket 路由 use think\facade\Route; Route::get('/ws', 'index/Chat'); ``` 最后,在 Swoole 服务器配置文件中开启 WebSocket 服务: ```php // Swoole 服务器配置文件 use think\swoole\Server; return [ 'host' => '0.0.0.0', 'port' => 9501, 'type' => Server::SERVER_TYPE_WEB_SOCKET, 'mode' => SWOOLE_PROCESS, 'sock_type' => SWOOLE_SOCK_TCP, 'option' => [ 'worker_num' => 8, 'daemonize' => false, 'backlog' => 128, ], ]; ``` 在上面的代码中,我们将服务器的类型设置为 WebSocket,并开启了 8 个 Worker 进程。 现在,我们就可以启动 Swoole 服务器,并在客户端连接到 WebSocket 服务后进行消息的发送和接收了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值