@H_502_2@swoole版本 4.2.13
粘包问题的产生和解决办法
产生原因
@H_502_2@TCP 是流式协议没有消息边界,客户端向服务器端发送一次数据,可能会被服务器端分成多次收到。客户端向服务器端发送多条数据。服务器端可能一次全部收到。发送方:发送方需要等缓冲区满才发送出去,造成粘包
接收方:接收方不及时接收缓冲区的包,造成多个包接收
粘包问题展现
@H_502_2@客户端代码<?PHP //粘包示例 客户端 $client = new Swoole\Client(SWOOLE_SOCK_TCP,SWOOLE_SOCK_SYNC); $client->connect("127.0.0.1",9331); for ($i=1;$i<10;$i++){ $client->send("123456".PHP_EOL); } echo $client->recv(); $client->close();@H_502_2@ @H_502_2@服务端代码
<?PHP //粘包示例服务端 $server = new Swoole\Server("0.0.0.0",9331,SWOOLE_PROCESS,SWOOLE_SOCK_TCP); $server->set([ 'worker_num'=>4, ]); $server->on("connect",function (swoole_server $server,int $fd){ echo "与客户端{$fd}已建立连接"; }); $server->on("receive",function (swoole_server $server,int $fd,$reactor_id,$data){ $server->send($fd,"服务端已成功接收消息"); echo "服务端收到客户端消息{$data}".PHP_EOL; }); $server->on("close",function (swoole_server $server,int $fd){ echo "Client {$fd} Close".PHP_EOL; }); $server->start();@H_502_2@启动客户端、启动服务端
[root@localhost bky]# PHP nb_server.PHP 与客户端1已建立连接服务端收到客户端消息123456 123456 123456 123456 123456 123456 123456 123456 123456 Client 1 Close@H_502_2@我们发现,分9次发送的消息,在服务端只接收到一次数据。
解决办法
@H_502_2@1、$server->set([ 'worker_num' => 4, //worker process num 'open_eof_check'=>true,//打开EOF检测 'package_eof'=>PHP_EOL,//设置EOF 'open_eof_split'=>true,//开启自动拆分 ]);@H_502_2@我们更改server端的代码,加入相关设置项,再次启动server和client
[root@localhost bky]# PHP nb_server.PHP 与客户端1已建立连接服务端收到客户端消息123456 服务端收到客户端消息123456 服务端收到客户端消息123456 服务端收到客户端消息123456 服务端收到客户端消息123456 服务端收到客户端消息123456 服务端收到客户端消息123456 服务端收到客户端消息123456 服务端收到客户端消息123456 Client 1 Close@H_502_2@可以发现粘包问题已解决 @H_502_2@ @H_502_2@未完待续 @H_502_2@
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。