粘包的问题
TCP 在发送数据的时候,因为存在数据缓存的关系,对于数据在发送的时候 短时间内连续的发送很小的数据时候就有可能一次性一起发送。还有就是大数据会连续的分多次发送
解决方案
$server->set(array(
'open_length_check' => true,
'package_max_length' => 81920,
'package_length_type' => 'N',
'package_length_offset' => 8,
'package_body_offset' => 16,
));
server
$server = new Swoole\Server("127.0.0.1", 9503);
$server->set([
// 'heartbeat_idle_time' => 20, // 表示一个连接如果20秒内未向服务器发送任何数据,此连接将被强制关闭
//'heartbeat_check_interval' => 8, // 表示每8秒遍历一次
'open_length_check' => true,
'package_max_length' => 81920,
'package_length_type' => 'N',
'package_length_offset' => 0,
'package_body_offset' => 4,
]);
$server->on('connect', function ($server, $fd){
echo "connection open: {$fd}\n";
});
$server->on('receive', function ($server, $fd, $reactor_id, $data) {
echo "接收到消息".$data."\n";
});
$server->on('close', function ($server, $fd) {
echo "connection close: {$fd}\n";
});
$server->start();
client
$client = new Swoole\Client(SWOOLE_SOCK_TCP );
if (!$client->connect('127.0.0.1', 9503, -1)) {
exit("connect failed. Error: {$client->errCode}\n");
}
// 模拟粘包的问题
$data = "study day day up";
$len = pack("N",strlen($data));
for ($i=0;$i<100;$i++){
$content = $len.$data;
$client->send($content);
}
echo $client->recv();
echo "kkkk\r\n";
$client->close();