swoole对于粘包问题的解决

1.EOF结束协议

在swoole_server中,配置open_eof_check为true,打开EOF检测,配置package_eof来指定EOF标记

2.固定包头+包体协议

php中 pack() 函数把数据装入一个二进制字符串

服务端代码 server 解包

<?php

class ServerPack

{

private $_serv;

/**

* init

*/

public function __construct()

{

$this->_serv = new Swoole\Server("127.0.0.1", 9501);

$this->_serv->set([

'worker_num' => 1,

'open_length_check' => true, // 开启协议解析

'package_length_type' => 'N', // 长度字段的类型

'package_length_offset' => 0, //第几个字节是包长度的值

'package_body_offset' => 4, //第几个字节开始计算长度

'package_max_length' => 81920, //协议最大长度

]);

$this->_serv->on('Receive', [$this, 'onReceive']);

}

public function onReceive($serv, $fd, $fromId, $data)

{

$info = unpack('N', $data);

$len = $info[1];

$body = substr($data, - $len);

echo "server received data: {$body} ";

}

/**

* start server

*/

public function start()

{

$this->_serv->start();

}

}

$reload = new ServerPack;

$reload->start();

客户端代码

<?php

$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);

$client->connect('127.0.0.1', 9501) || exit("connect failed. Error: {$client->errCode} ");

// 向服务端发送数据

for ($i = 0; $i < 3; $i++) {

$data = "Just a test.";

$data = pack('N', strlen($data)) . $data;

$client->send($data);

}

$client->close();

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章