首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
请问swoole 自定义怎么处理,看了好长时间没理解,请打神解释一下
首先我想设计一个最简单的协议:bodylenth(4byte) + body 这是swoole_sever 设置: ```php $this->server->set([ 'reactor_num' => 4, //reactor thread num 'worker_num' => 4, //worker process num 'backlog' => 128, //listen backlog 'max_request' => 50000, 'task_worker_num' =>10, 'open_length_check' => true, 'package_max_length' => 80000, 'package_length_type' => 'N', 'package_length_offset' => 0, 'package_body_offset' => 4, ]); ``` 这是client代码: ```php $client = new swoole_client(SWOOLE_SOCK_TCP); if (!$client->connect('127.0.0.1', 9999, -1)) { exit("connect failed. Error: {$client->errCode}\n"); } $str = '您好啊'; $length = strlen($str); $body = pack('a'.$length,$str); $length = strlen($body); $bin_head = pack('N',$length); $bin_data = $bin_head.$body; $client->send($bin_data); echo $client->recv(); $client->close(); ``` 这样云client断后 我在回调receive中直接var_dump($data); 会打印出这些: string(13) "\000\000\000 您好啊" 问:①为什么中文前面有\000这些数据,我不是设置了package_body_offset=4了么 ② 为什么package_length只能是4byte,不可以是8byte嘛?如果是8byte我应该怎么设置。
发布于5年前 · 1 次浏览 · 来自
提问
3
346243025
首先我想设计一个最简单的协议:bodylenth(4byte) + body 这是swoole_sever 设置: ```php $this->server->set([ 'reactor_num' => 4, //reactor thread num 'worker_num' => 4, //worker process num 'backlog' => 128, //listen backlog 'max_request' => 50000, 'task_worker_num' =>10, 'open_length_check' => true, 'package_max_length' => 80000, 'package_length_type' => 'N', 'package_length_offset' => 0, 'package_body_offset' => 4, ]); ``` 这是client代码: ```php $client = new swoole_client(SWOOLE_SOCK_TCP); if (!$client->connect('127.0.0.1', 9999, -1)) { exit("connect failed. Error: {$client->errCode}\n"); } $str = '您好啊'; $length = strlen($str); $body = pack('a'.$length,$str); $length = strlen($body); $bin_head = pack('N',$length); $bin_data = $bin_head.$body; $client->send($bin_data); echo $client->recv(); $client->close(); ``` 这样云client断后 我在回调receive中直接var_dump($data); 会打印出这些: string(13) "\000\000\000 您好啊" 问:①为什么中文前面有\000这些数据,我不是设置了package_body_offset=4了么 ② 为什么package_length只能是4byte,不可以是8byte嘛?如果是8byte我应该怎么设置。
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2019-04-12
追
追逐
`Swoole`只根据这些参数来处理`TCP`数据包的边界,并不修改数据。因此你客户端发送的数据和服务器发送的数据是完全一致的。既然你服务器发送的数据是`4`字节长度+包体。客户端当然会有这个数据。 目前不支持`8`字节长度类型。
赞
0
回复
微信公众号
热门内容
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。