概述这是关于 Swoole 学习的第五篇文章:Swoole 多协议 多端口 的应用。
第四篇:Swoole HTTP 的应用第三篇:Swoole WebSocket 的应用第二篇:Swoole Task 的应用第一篇:Swoole Timer 的应用主要参考官方的这两篇文章,进行实现的 Demo。
网络通信协议设计:https://wiki.swoole.com/wiki/...多端口监听的使用:https://wiki.swoole.com/wiki/...希望通过我提供的 Demo,能够对文档有更加深刻的理解。
网络通信协议设计为什么需要通信协议?
官方:TCP协议在底层机制上解决了UDP协议的顺序和丢包重传问题。但相比UDP又带来了新的问题,TCP协议是流式的,数据包没有边界。应用程序使用TCP通信就会面临这些难题。因为TCP通信是流式的,在接收1个大数据包时,可能会被拆分成多个数据包发送。多次Send底层也可能会合并成一次进行发送。这里就需要2个操作来解决:分包 和 合包,所以TCP网络通信时需要设定通信协议。Swoole 支持了2种类型的自定义网络通信协议 :EOF结束符协议、固定包头+包体协议。
EOF结束符协议
先看下,未设置协议的效果:
发送的每条数据长度都是 23,但在 onReceive 接收数据的时候每次接收的长度不一样,并没有按照想象的方式进行分包。
再看下,设置了EOF结束符协议的效果:
发送的每条数据长度都是 23,在 onReceive 接收数据的时候每次接收的也是 23 ,完美。
主要设置项如下:
'package_max_length' => '8192','open_eof_split' => true,'package_eof' => "\r\n"不做解释,官方文档已经写的很清楚。
示例代码如下:
server.php
<?phpclass Server{ private $serv; public function __construct() { $this->serv = new swoole_server('0.0.0.0', 9501); $this->serv->set([ 'worker_num' => 2, //开启2个worker进程 'max_request' => 4, //每个worker进程 max_request设置为4次 'dispatch_mode' => 2, //数据包分发策略 - 固定模式 //EOF结束符协议 'package_max_length' => '8192', 'open_eof_split' => true, 'package_eof' => "\r\n" ]); $this->serv->on('Start', [$this, 'onStart']); $this->serv->on('Connect', [$this, 'onConnect']); $this->serv->on("Receive", [$this, 'onReceive']); $this->serv->on("Close", [$this, 'onClose']); $this->serv->start(); } public function onStart($serv) { echo "#### onStart ####".PHP_EOL; echo "SWOOLE ".SWOOLE_VERSION . " 服务已启动".PHP_EOL; echo "swoole_cpu_num:".swoole_cpu_num().PHP_EOL; echo "master_pid: {$serv->master_pid}".PHP_EOL; echo "manager_pid: {$serv->manager_pid}".PHP_EOL; echo "########".PHP_EOL.PHP_EOL; } public function onConnect($serv, $fd) { echo "#### onConnect ####".PHP_EOL; echo "客户端:".$fd." 已连接".PHP_EOL; echo "########".PHP_EOL.PHP_EOL; } public function onReceive($serv, $fd, $from_id, $data) { echo "#### onReceive ####".PHP_EOL; var_dump($data); } public function onClose($serv, $fd) { echo "Client Close.".PHP_EOL; }}$server = new Server();client.php
...