首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
TCP分包设置疑问
java那边定的包协议 ```java /** * 包头包体总长 */ private Integer length; /** * 协议命令号 */ private Integer cmd; /** * 消息序列 */ private Integer seq; /** * 请求结果 */ private byte type; /** * 用户账户 */ private Long uid; /** * 包体文件 */ private byte[] protoBuf; ``` 我用swoole进行模拟测试。 server.php ```php <?php //创建Server对象,监听 127.0.0.1:9501端口 $serv = new Swoole\Server("127.0.0.1", 9501); $serv->set(array( 'open_length_check' => true, 'package_length_type' => 'N', 'package_body_offset' => 0, 'package_length_offset' => 0, 'package_max_length' => 81920, )); //监听连接进入事件 $serv->on('Connect', function ($serv, $fd) { echo "Client: Connect.\n"; }); //监听数据接收事件 $serv->on('Receive', function ($serv, $fd, $from_id, $data) { $arr = unpack('Nlength/Ncmd/Nseq/ctype/quid/a*protoBuf', $data); $serv->send($fd, var_export($arr, true)); }); //监听连接关闭事件 $serv->on('Close', function ($serv, $fd) { echo "Client: Close.\n"; }); //启动服务器 $serv->start(); ``` client.php ```php <?php $client = new \Swoole\Client(SWOOLE_SOCK_TCP); if (!$client->connect('127.0.0.1', 9501, -1)) { exit("connect failed. Error: {$client->errCode}\n"); } $cmd = pack('N', 100); $seq = pack('N', 1000); $type = pack('c', 1); $uid = pack('q', 10000); $protoBuf = pack('a*', 'abc'); $tmp = $cmd.$seq.$type.$uid.$protoBuf; $length = pack('N', 32 + strlen($tmp)); $send = $length.$tmp; $client->send($send); echo $client->recv(), PHP_EOL; $client->close(); ``` 当我把`open_length_check`设置为`false`的时候,上面的代码是能跑通的,由于我对于`pack()`与`unpack()`我一直看不懂,所以我不知道是我的`pack()`与`unpack()`不行,还是`swoole`的分包没设置对,或是都有问题,请大佬教学一波,感谢。
发布于6年前 · 13 次浏览 · 来自
讨论
天王盖地虎
java那边定的包协议 ```java /** * 包头包体总长 */ private Integer length; /** * 协议命令号 */ private Integer cmd; /** * 消息序列 */ private Integer seq; /** * 请求结果 */ private byte type; /** * 用户账户 */ private Long uid; /** * 包体文件 */ private byte[] protoBuf; ``` 我用swoole进行模拟测试。 server.php ```php <?php //创建Server对象,监听 127.0.0.1:9501端口 $serv = new Swoole\Server("127.0.0.1", 9501); $serv->set(array( 'open_length_check' => true, 'package_length_type' => 'N', 'package_body_offset' => 0, 'package_length_offset' => 0, 'package_max_length' => 81920, )); //监听连接进入事件 $serv->on('Connect', function ($serv, $fd) { echo "Client: Connect.\n"; }); //监听数据接收事件 $serv->on('Receive', function ($serv, $fd, $from_id, $data) { $arr = unpack('Nlength/Ncmd/Nseq/ctype/quid/a*protoBuf', $data); $serv->send($fd, var_export($arr, true)); }); //监听连接关闭事件 $serv->on('Close', function ($serv, $fd) { echo "Client: Close.\n"; }); //启动服务器 $serv->start(); ``` client.php ```php <?php $client = new \Swoole\Client(SWOOLE_SOCK_TCP); if (!$client->connect('127.0.0.1', 9501, -1)) { exit("connect failed. Error: {$client->errCode}\n"); } $cmd = pack('N', 100); $seq = pack('N', 1000); $type = pack('c', 1); $uid = pack('q', 10000); $protoBuf = pack('a*', 'abc'); $tmp = $cmd.$seq.$type.$uid.$protoBuf; $length = pack('N', 32 + strlen($tmp)); $send = $length.$tmp; $client->send($send); echo $client->recv(), PHP_EOL; $client->close(); ``` 当我把`open_length_check`设置为`false`的时候,上面的代码是能跑通的,由于我对于`pack()`与`unpack()`我一直看不懂,所以我不知道是我的`pack()`与`unpack()`不行,还是`swoole`的分包没设置对,或是都有问题,请大佬教学一波,感谢。
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2020-04-26
鲁飞
参考Swoole微课程:[TCP分包问题—如何利用swoole解决分包问题](https://course.swoole-cloud.com/course-video/104)
赞
0
回复
2020-04-26
天王盖地虎
回复
鲁飞
我就是看了这个视频才斗胆尝试一把的,结果就是上面那样子。
赞
0
回复
2020-04-26
天王盖地虎
回复
鲁飞
`$length = pack('N', 32 + strlen($tmp));`写错了,改为`$length = pack('N', 4 + strlen($tmp));`就可以了。
赞
2
回复