首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
swooleServer处理websocket长文本解包错误
服务端是swoole_server 1.9.14,客户端是安卓App(Java) 写的websocket 我有需求做长文本的发送,要实现5000个汉字的消息处理; 服务端在检测到时websocket客户端时,进行解包操作。解包代码: {{{ <?php function unwrap($message="") { //取第一字节低4位即为opcode $opcode = ord(substr($message, 0, 1)) & 0x0F; //取第二字节低7位则为payload长度(第一位为mask) $payloadLength = ord(substr($message, 1, 1)) & 0x7F; //取第二字节高一位及为mask值(0或1,是否进行掩码处理) $isMask = (ord(substr($message, 1, 1)) & 0x80) >> 7; $maskKey = null; $data = null; $decodeData = null; //数据不合法($isMask不为1则表示没有进行掩码处理,0x8表示连接断开) if ($isMask != 1 || $opcode == 0x8) { return false; } //获取掩码密钥和原始数据 if ($payloadLength >= 0 && $payloadLength <= 125) { //如果payload长度为0-125,第二字节为payload长度,3-6的4个字节为mask key,剩余为数据 $maskKey = substr($message, 2, 4); $data = substr($message, 6); } else if ($payloadLength == 126) { //如果payload长度为126,第二字节为payload长度,3-4的两个字节为数据长度,5-8的4个字节为mask key,剩余为数据 $maskKey = substr($message, 4, 4); $data = substr($message, 8); } else if ($payloadLength == 127) { //如果payload长度为127,第二字节为payload长度,3-10的8个字节为数据长度,11-14的4个字节为mask key,剩余为数据 $maskKey = substr($message, 10, 4); $data = substr($message, 14); } //进行掩码处理 $length = strlen($data); for($i = 0; $i < $length; $i++) { $decodeData .= $data[$i] ^ $maskKey[$i % 4]; } return $decodeData; } }}} 这段代码是从网上找的,我看不懂。 客户端在遇到文本超过一定长度时会分两次以上的请求。我从打印的日志看到第一次请求可以成功解包,但第二次请求之后就异常了,得到的是乱码。 希望大神指点
发布于7年前 · 2 次浏览 · 来自
提问
K
King
服务端是swoole_server 1.9.14,客户端是安卓App(Java) 写的websocket 我有需求做长文本的发送,要实现5000个汉字的消息处理; 服务端在检测到时websocket客户端时,进行解包操作。解包代码: {{{ <?php function unwrap($message="") { //取第一字节低4位即为opcode $opcode = ord(substr($message, 0, 1)) & 0x0F; //取第二字节低7位则为payload长度(第一位为mask) $payloadLength = ord(substr($message, 1, 1)) & 0x7F; //取第二字节高一位及为mask值(0或1,是否进行掩码处理) $isMask = (ord(substr($message, 1, 1)) & 0x80) >> 7; $maskKey = null; $data = null; $decodeData = null; //数据不合法($isMask不为1则表示没有进行掩码处理,0x8表示连接断开) if ($isMask != 1 || $opcode == 0x8) { return false; } //获取掩码密钥和原始数据 if ($payloadLength >= 0 && $payloadLength <= 125) { //如果payload长度为0-125,第二字节为payload长度,3-6的4个字节为mask key,剩余为数据 $maskKey = substr($message, 2, 4); $data = substr($message, 6); } else if ($payloadLength == 126) { //如果payload长度为126,第二字节为payload长度,3-4的两个字节为数据长度,5-8的4个字节为mask key,剩余为数据 $maskKey = substr($message, 4, 4); $data = substr($message, 8); } else if ($payloadLength == 127) { //如果payload长度为127,第二字节为payload长度,3-10的8个字节为数据长度,11-14的4个字节为mask key,剩余为数据 $maskKey = substr($message, 10, 4); $data = substr($message, 14); } //进行掩码处理 $length = strlen($data); for($i = 0; $i < $length; $i++) { $decodeData .= $data[$i] ^ $maskKey[$i % 4]; } return $decodeData; } }}} 这段代码是从网上找的,我看不懂。 客户端在遇到文本超过一定长度时会分两次以上的请求。我从打印的日志看到第一次请求可以成功解包,但第二次请求之后就异常了,得到的是乱码。 希望大神指点
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2019-01-04
谁
谁 主 沉 浮 ?
异常的返回结果,如附件图片
赞
0
回复
2019-01-05
安余生
我看来很多资料说 websocket 客户端会将一条消息分多次发送;每一就是一个帧;帧的结构比较复杂。 我现在想要得到 fin, 这是是代表该帧是结束帧,1代表是结束,0代表未结束。 我计算的方式是这样的: {{{ $fin = ord(substr($message, 0, 1)) >> 7; }}} 但这样计算有问题,用浏览器测试,一条消息分出的两个帧,有时候 得到的fin 值都是 1
赞
0
回复
2019-01-05
卑
卑微的荣耀
fin ,有没有人知道怎么计算啊
赞
0
回复
2019-01-05
一
一鸣
我有一个问题websocket传递到服务端的数据,应该是二进制的。为什么而我看到的明显不是二进制,是在onmessage的时候转换了?
赞
0
回复