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 条评论) “” |