首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
swoole websock 客户端接受到数据乱码
### swoole websock client端 接受的数据乱码 ### Swoole版本`4.4.12`,PHP版本`7.3.11`,以及操作系统版本信息 `centos 64位` ### 相关代码 ```php $client = new \Swoole\Coroutine\Http\Client($server['ip'], $server['port']); $client->set(array( 'open_eof_check' => true, 'package_eof' => "\r\n", 'open_eof_split' => true, 'package_max_length' => 1024 * 1024 * 2, )); $result = $client->upgrade("/"); if ($result) { $client->push($message); while (true) { $data = $client->recv(); var_dump($data); \co::sleep(0.1); if (!$data) { return 1; } } } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么?  在此感谢各位大佬指点!
发布于6年前 · 5 次浏览 · 来自
提问
两袖清风
### swoole websock client端 接受的数据乱码 ### Swoole版本`4.4.12`,PHP版本`7.3.11`,以及操作系统版本信息 `centos 64位` ### 相关代码 ```php $client = new \Swoole\Coroutine\Http\Client($server['ip'], $server['port']); $client->set(array( 'open_eof_check' => true, 'package_eof' => "\r\n", 'open_eof_split' => true, 'package_max_length' => 1024 * 1024 * 2, )); $result = $client->upgrade("/"); if ($result) { $client->push($message); while (true) { $data = $client->recv(); var_dump($data); \co::sleep(0.1); if (!$data) { return 1; } } } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么?  在此感谢各位大佬指点!
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2020-05-08
鲸落
我这测试了没问题,客户端的和你一样,这是我的服务端: ``` <?php use Swoole\WebSocket\Server; $server = new Server('0.0.0.0', 9501); $server->set(array( 'open_eof_check' => true, 'package_eof' => "\r\n", 'open_eof_split' => true, 'package_max_length' => 1024 * 1024 * 2, )); $server->on('message', function (Server $ws, \Swoole\WebSocket\Frame $frame) { $data = $frame->data; $data = explode("\r\n",$data); foreach ($data as $item) { if ($item) { $ws->push($frame->fd, $item . "\r\n"); } } }); $server->start(); ```
赞
0
回复
2020-05-08
两袖清风
回复
鲸落
用swoole提供的websocket server端确实没有问题,乱码的问题发生在python实现的server端,不知道哪里问题
赞
0
回复
2020-05-08
鲸落
回复
两袖清风
python那边发送, 可能是编码的问题
赞
0
回复
2020-05-08
两袖清风
回复
鲸落
大佬能有什么尝试的方案和方向么,我来一个一个调试
赞
0
回复
2020-05-08
鲸落
回复
两袖清风
不知到你的python server怎么编码的,我百度了一个简单的,python2.7,没有编码发送的,客户端接受的也是正常的, ``` #-*- coding:utf8 -*- import threading import hashlib import socket import base64 class websocket_thread(threading.Thread): def __init__(self, connection): super(websocket_thread, self).__init__() self.connection = connection def run(self): reply = 'i got u, from websocket server.' length = len(reply) while True: data = self.connection.recv(1024) print parse_data(data) self.connection.send('%c%c%s' % (0x81, length, reply)) def parse_data(msg): v = ord(msg[1]) & 0x7f if v == 0x7e: p = 4 elif v == 0x7f: p = 10 else: p = 2 mask = msg[p:p+4] data = msg[p+4:] return ''.join([chr(ord(v) ^ ord(mask[k%4])) for k, v in enumerate(data)]) def parse_headers(msg): headers = {} header, data = msg.split('\r\n\r\n', 1) for line in header.split('\r\n')[1:]: key, value = line.split(': ', 1) headers[key] = value headers['data'] = data return headers def generate_token(msg): key = msg + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' ser_key = hashlib.sha1(key).digest() return base64.b64encode(ser_key) if __name__ == '__main__': sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('127.0.0.1', 9000)) sock.listen(5) while True: connection, address = sock.accept() try: data = connection.recv(1024) headers = parse_headers(data) token = generate_token(headers['Sec-WebSocket-Key']) connection.send('HTTP/1.1 101 WebSocket Protocol Hybi-10\r\nUpgrade: WebSocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: %s\r\n\r\n' % token) thread = websocket_thread(connection) thread.start() except socket.timeout: print 'websocket connection timeout' ```
赞
0
回复
2020-05-08
两袖清风
回复
鲸落
感谢大佬,最后python 那边换成远程socket 问题解决掉了!
赞
0
回复
2020-05-08
鲸落
把你python 代码贴一下吧,转发那块就行,应该是编码的问题。
赞
0
回复