💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
>[info] TCP粘包的问题 * tcp在发送数据的时候因为存在数据缓存的关系,对于数据在发送的时候在 短时间内 如果连续发送很多小的数据的时候就会有可能一次性一起发送,还有就是对于大的数据就会分开连续发送多次。 ***** >[info] TCP粘包代码复现 * **服务端代码** ~~~ <?php echo swoole_get_local_ip()['ens33'] . ':9503' . PHP_EOL; // 实例化swoole 服务端 $server = new Swoole\Server("0.0.0.0", 9503); // 连接 $server->on('connect', function ($server, $fd){ echo "connection open: {$fd}\n"; }); // 消息 $server->on('receive', function ($server, $fd, $reactor_id, $data) { $server->send($fd, "接收到数据: {$data}"); // $server->close($fd); }); // 关闭 $server->on('close', function ($server, $fd) { echo "connection close: {$fd}\n"; }); // 打开 $server->start(); ~~~ * **客户端代码** ~~~ <?php // 实例化客户端 $client = new Swoole\Client(SWOOLE_SOCK_TCP); // 建立连接 if (!$client->connect('127.0.0.1', 9503, -1)) { exit("connect failed. Error: {$client->errCode}\n"); } // 循环发送信息 for ($i = 0;$i < 20;$i++) { // 发送 $client->send("hello_world_"); } // 获取服务端数据 echo $client->recv(); // 不断开连接 // while (true){} // 关闭 //$client->close(); ~~~ * **执行效果** 1. 开启服务端监听 ![](https://img.kancloud.cn/52/65/52659ef24f07ffebd18da39c1dba586c_435x121.png) 2. 客户端运行 * 发现循环20次发送并不是一次性,出现粘包现象。 ![](https://img.kancloud.cn/38/20/382008d916ec0e7f9a332a83ef62b97d_764x135.png) ***** >[info] TCP拆包代码复现 * 当服务端接收到数据过大的时候,tcp传输将会把数据包拆分发送。 * **服务端代码** ~~~ <?php echo swoole_get_local_ip()['ens33'] . ':9503' . PHP_EOL; // 实例化swoole 服务端 $server = new Swoole\Server("0.0.0.0", 9503); // 连接 $server->on('connect', function ($server, $fd){ echo "connection open: {$fd}\n"; }); // 消息 $server->on('receive', function ($server, $fd, $reactor_id, $data) { echo '接收到数据:' . $fd . "\n"; $server->send($fd, "Swoole:ok"); // $server->close($fd); }); // 关闭 $server->on('close', function ($server, $fd) { echo "connection close: {$fd}\n"; }); // 打开 $server->start(); ~~~ * **客户端代码** ~~~ <?php // 实例化客户端 $client = new Swoole\Client(SWOOLE_SOCK_TCP); // 建立连接 if (!$client->connect('127.0.0.1', 9503, -1)) { exit("connect failed. Error: {$client->errCode}\n"); } // 发送 $client->send(str_repeat('123456',100000)); // 获取服务端数据 echo $client->recv(); // 不断开连接 // while (true){} // 关闭 //$client->close(); ~~~ * **执行效果** 1. 开启服务端监听 * 服务端接收到多次数据包,以为着发送过程中已进行拆包处理。 ![](https://img.kancloud.cn/92/08/9208fa5589c5eba22b0dbbc9dd4a5279_580x193.png) 2. 客户端执行 ![](https://img.kancloud.cn/69/5e/695ea2ac0d2b10d81710beac5c8b3ea5_500x109.png) >[info] tcp 数据发送过程 * 当有数据来了,首先会把数据放入缓存区,他会根据定时或满了去发送数据,他不会去区分是第一次还是第二次发送的数据包,所以会存在粘包问题。<span style="color:red;">**(排好队,一个一个来)**</span> ![](https://img.kancloud.cn/6e/43/6e43e6331b7db986dd5455a3441212d8_1425x707.png) ![](https://img.kancloud.cn/b0/56/b056a39327b2dfb489d03284fa961d5a_1500x846.png)