0

0

swoole json不完整怎么办

藏色散人

藏色散人

发布时间:2020-04-09 10:16:49

|

2669人浏览过

|

来源于php中文网

原创

swoole json不完整怎么办

swoole json不完整怎么办?

swoole客户端与服务端收发数据完整性问题解决

一、下面这个实例,启动swoole服务后,监听9501端口,接收从客户端发来的数据,原样返回。

class Server
{
    private $serv;
    public function __construct() {
        $this->serv = new swoole_server("127.0.0.1", 9501);
        $this->serv->set(array(
            'worker_num'     => 4,   //一般设置为服务器CPU数的1-4倍
            'daemonize'      => 1,  //以守护进程执行
            'max_request'     => 2000,
            'dispatch_mode'    => 2,//进程数据包分配模式 1平均分配,2按FD取摸固定分配,3抢占式分配
            'task_worker_num'   => 8,  //task进程的数量
            "task_ipc_mode "   => 3 ,  //使用消息队列通信,并设置为争抢模式
            "log_file"      => "./log/taskqueueu.log" ,//日志
        ));
        $this->serv->on('Receive', array($this,'onReceive'));//接收到数据时回调此函数
        $this->serv->start();
    }
    public function onReceive(swoole_server $serv, $fd, $from_id, $data ) {
                $serv->send($fd, $data);
                        usleep(500); //不加延时的话,经常两条数据被合并成一条返回了。
                        $serv->close($fd);
    }   
    public function onClose(swoole_server $serv, $fd) {
                $serv->send($fd, 'CLOSED');
    }   
}

直接new Server启动服务端。

二、启动swoole客户端,向服务端发数据,并接收返回。

$client = new swoole_client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9501, -1))
{
    exit("connect failed. Error: {$client->errCode}\n");
}
$data=[
        'type'=>1, 
        'data'=>array(
                'PlatformCode'=>'...........很长的数据.',
            )
   ];
$sender=$client->send(json_encode($data)."\r\n\r\n");
while($result = $client->recv()){
    if($result=='CLOSED'){
            echo "任务结束。byebye~\r\n";
            break;
    }else{
      echo $result;
  }
}
$client->close();

当发送比较大的数据包时,会发现接收到的json包是不完整的,可以使用EOF协议处理的方式来解决,比如在服务端设置:

    $serv->set(
        array('open_eof_split' => TRUE, 'package_eof' => "\r\n\r\n")
    );

这样,'\r\n\r\n'就成为EOF协议结束符。

发送数据包时,在包结尾添加上'\r\n\r\n',接口数据时遇到这个字符就认为数据接收完毕,如此就保证的数据的完整性。

Teleporthq
Teleporthq

一体化AI网站生成器,能够快速设计和部署静态网站

下载

注:数据包中不能出现'\r\n\r\n'字符,否则会出现分包错误。

Swoole的Server和异步Client都是在onReceive回调函数中处理数据包,当设置了协议处理后,只有收到一个完整数据包时才会触发onReceive事件。

另外一种方式,也可以预先设定好要发送的包的长度,如:

$server->set(array(
        'open_length_check' => true,
        'package_max_length' => 81920,
        'package_length_type' => 'n', //see php pack()
        'package_length_offset' => 0,
        'package_body_offset' => 2,
));

可以固定包的长度来确保数据的完整性,官方注释如下:

固定包头的协议非常通用,在BAT的服务器程序中经常能看到。这种协议的特点是一个数据包总是由包头+包体2部分组成。包头由一个字段指定了包体或整个包的长度,长度一般是使用2字节/4字节整数来表示。服务器收到包头后,可以根据长度值来精确控制需要再接收多少数据就时完整的数据包。Swoole的配置可以很好的支持这种协议,可以灵活地设置4项参数应对所有情况。

Swoole的Server和异步Client都是在onReceive回调函数中处理数据包,当设置了协议处理后,只有收到一个完整数据包时才会触发onReceive事件。同步客户端在设置了协议处理后,调用 $client->recv() 不再需要传入长度,recv函数在收到完整数据包或发生错误后返回。

相关专题

更多
swoole为什么能常驻内存
swoole为什么能常驻内存

swoole常驻内存的特性:1. 事件驱动模型减少内存消耗;2. 协程并行执行任务占用更少内存;3. 协程池预分配协程消除创建开销;4. 静态变量保留状态减少内存分配;5. 共享内存跨协程共享数据降低内存开销。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

290

2024.04.10

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

412

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1023

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

65

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

419

2025.12.29

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
swoole进程树解析
swoole进程树解析

共4课时 | 0.2万人学习

Swoole系列-从0到1-新手进阶
Swoole系列-从0到1-新手进阶

共29课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号