首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
websoocket的客户端断网重连后发送ping到服务器,收不到服务器返回来的收到ping的信息
### 问题描述 swoole 创建的websocket服务器我前段代码写了断开自动重连机制,当我在本机测试重连的时候,估计断开网络后再重连客户端发送的ping数据服务器能收到,但是服务器发送的回复ping的数据客户端就收不到了,我看了写下客户端重新连接后的fd是新的,代表服务器没有给原来的fd发送数据,服务器向新的fd发送数据,客户端现在就是不触发onmessage ### Swoole版本,PHP版本,以及操作系统版本信息 swoole版本4.4 PHP版本7.0 操作系统centos7.0 ### 相关代码 websocket 相关代码 public function __construct() { $this->server = new Swoole\WebSocket\Server("0.0.0.0", 9505); //$this->server->on('handshake',[$this,'handshake']); $this->server->on('open', [$this, 'onOpen']); $this->server->on('message', [$this, 'onMessage']); $this->server->on('close', [$this, 'onClose']); //配置选项 $this->server->set(array( 'reactor_num' => 2, // reactor thread num 'worker_num' => 4, // 开启worker进程 'backlog' => 128, // listen backlog 'max_request' => 50, //每个worker进程 max_request设置为4次 //'dispatch_mode' => 1, 'heartbeat_check_interval' => 3, //每5秒侦测一次心跳 'heartbeat_idle_time' => 9, //一个TCP连接如果在10秒内未向服务器端发送数据,将会被切断 //'task_worker_num' => 4, //开启4个task进程 'daemonize' => false, //守护进程(true/false) 'dispatch_mode' => 5, //uid dispatch 'socket_buffer_size' => 512 * 1024 * 1024, 'log_file' => 'swoole.log', 'max_connection' => 10000 // 最多允许tcp链接数 //'buffer_output_size' => 2, )); $this->server->start(); } /** * 监听websocket的消息事件 * @param $server * @param $frame */ public function onMessage($server,$frame) { $message = json_decode($frame->data,true); switch($message['type']){ case 'ping': var_dump(json_encode(['fd'=>$frame->fd,'type'=>'ping'])); //$server->push(intval($frame->fd),json_encode(['type'=>'ping'])); foreach ($server->connections as $conn){ $server->push($conn,json_encode(['type'=>'ping'])); } break; case 'ctos': //echo "{$message['msg']}------{$message['to']}\r\n"; /*foreach ($server->connections as $conn){ //$server->push($conn,$msg); $server->push($conn,json_encode(['type'=>'onetone','data'=>$message['msg']])); }*/ //$server->push($frame->fd,json_encode(['type'=>'onetone','data'=>$message['msg']])); go(function () use($server,$message) { $redis = new Swoole\Coroutine\Redis(); $redis->connect('127.0.0.1', 6393); $redis->auth('88myP3CJmR!rc7#a'); $fd = $redis->get("kf_{$message['to']}"); $self = $redis->get("customer_{$message['from']}"); //转义存redis $sendMgs = json_encode(['type'=>'onetone','data'=>htmlspecialchars($message['msg']),'from'=>$message['from'],'to'=>$message['to'],'ctime'=>time(),'is_read'=>'1','id'=>$this->msectime()]); //1未读2已读 $server->push(intval($fd),$sendMgs); $server->push(intval($self),$sendMgs); //记录存入redis 数据格式 客户id_客服id json $redis->sadd('chat_log',$sendMgs); }); //$redis = new Swoole\Coroutine\Redis(); //$redis->connect('127.0.0.1', 6393); //$redis->auth('88myP3CJmR!rc7#a'); //$fd = $redis->get("kf_{$message['to']}"); //$server->push(intval($fd),json_encode(['type'=>'onetone','data'=>$message['msg'],'from'=>$message['from'],'to'=>$message['to']])); /*foreach ($server->connections as $conn){ //$server->push($conn,$msg); $server->push($conn,json_encode(['type'=>'onetone','data'=>$message['msg'],'from'=>$message['from'],'to'=>$message['to']])); }*/ break; case 'stoc': go(function () use($server,$message) { $redis = new Swoole\Coroutine\Redis(); $redis->connect('127.0.0.1', 6393); $redis->auth('88myP3CJmR!rc7#a'); $fd = $redis->get("customer_{$message['to']}"); $self = $redis->get("kf_{$message['from']}"); $sendMgs = json_encode(['type'=>'onetone','data'=>htmlspecialchars($message['msg']),'from'=>$message['from'],'to'=>$message['to'],'ctime'=>time(),'is_read'=>'1','id'=>$this->msectime()]); //1未读2已读 $server->push(intval($fd),$sendMgs); $server->push(intval($self),$sendMgs); //记录存入redis 数据格式 客户id_客服id json $redis->sadd('chat_log',$sendMgs); }); break; case 'bind': $res = $server->bind(intval($frame->fd),intval($message['uuid'])); $this->uuid = $message['uuid']; //echo "bind ".intval($this->uuid)."->".$frame->fd."\r\n"; if($res){ $server->push($frame->fd,json_encode(['type'=>'bind_success','info'=>$frame->fd])); }else{ $server->push($frame->fd,json_encode(['type'=>'bind_error'])); } break; case 'online': foreach ($server->connections as $conn){ $server->push($conn,json_encode(['type'=>'online'])); } break; case 'online_num': $num =0; $list = []; foreach($server->connections as $conn){ ++$num; //echo $conn."\r\n"; $list[] = $conn; } $server->push($frame->fd,json_encode(['type'=>'online_num','info'=>$num,'list'=>$list])); break; case 'live': foreach ($server->connections as $conn){ $server->push($conn,json_encode(['type'=>'live','data'=>$message['data']])); } break; } //var_dump($message); //echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; //$server->push($frame->fd, "this is server"); } 请将代码粘贴至此处(请勿用截图) ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 结果是我客户端断线重连后服务器返回收到ping的消息我客户端可以正常收到触发onmessage
发布于4年前 · 3 次浏览 · 来自
提问
西
西北玄天一朵云
### 问题描述 swoole 创建的websocket服务器我前段代码写了断开自动重连机制,当我在本机测试重连的时候,估计断开网络后再重连客户端发送的ping数据服务器能收到,但是服务器发送的回复ping的数据客户端就收不到了,我看了写下客户端重新连接后的fd是新的,代表服务器没有给原来的fd发送数据,服务器向新的fd发送数据,客户端现在就是不触发onmessage ### Swoole版本,PHP版本,以及操作系统版本信息 swoole版本4.4 PHP版本7.0 操作系统centos7.0 ### 相关代码 websocket 相关代码 public function __construct() { $this->server = new Swoole\WebSocket\Server("0.0.0.0", 9505); //$this->server->on('handshake',[$this,'handshake']); $this->server->on('open', [$this, 'onOpen']); $this->server->on('message', [$this, 'onMessage']); $this->server->on('close', [$this, 'onClose']); //配置选项 $this->server->set(array( 'reactor_num' => 2, // reactor thread num 'worker_num' => 4, // 开启worker进程 'backlog' => 128, // listen backlog 'max_request' => 50, //每个worker进程 max_request设置为4次 //'dispatch_mode' => 1, 'heartbeat_check_interval' => 3, //每5秒侦测一次心跳 'heartbeat_idle_time' => 9, //一个TCP连接如果在10秒内未向服务器端发送数据,将会被切断 //'task_worker_num' => 4, //开启4个task进程 'daemonize' => false, //守护进程(true/false) 'dispatch_mode' => 5, //uid dispatch 'socket_buffer_size' => 512 * 1024 * 1024, 'log_file' => 'swoole.log', 'max_connection' => 10000 // 最多允许tcp链接数 //'buffer_output_size' => 2, )); $this->server->start(); } /** * 监听websocket的消息事件 * @param $server * @param $frame */ public function onMessage($server,$frame) { $message = json_decode($frame->data,true); switch($message['type']){ case 'ping': var_dump(json_encode(['fd'=>$frame->fd,'type'=>'ping'])); //$server->push(intval($frame->fd),json_encode(['type'=>'ping'])); foreach ($server->connections as $conn){ $server->push($conn,json_encode(['type'=>'ping'])); } break; case 'ctos': //echo "{$message['msg']}------{$message['to']}\r\n"; /*foreach ($server->connections as $conn){ //$server->push($conn,$msg); $server->push($conn,json_encode(['type'=>'onetone','data'=>$message['msg']])); }*/ //$server->push($frame->fd,json_encode(['type'=>'onetone','data'=>$message['msg']])); go(function () use($server,$message) { $redis = new Swoole\Coroutine\Redis(); $redis->connect('127.0.0.1', 6393); $redis->auth('88myP3CJmR!rc7#a'); $fd = $redis->get("kf_{$message['to']}"); $self = $redis->get("customer_{$message['from']}"); //转义存redis $sendMgs = json_encode(['type'=>'onetone','data'=>htmlspecialchars($message['msg']),'from'=>$message['from'],'to'=>$message['to'],'ctime'=>time(),'is_read'=>'1','id'=>$this->msectime()]); //1未读2已读 $server->push(intval($fd),$sendMgs); $server->push(intval($self),$sendMgs); //记录存入redis 数据格式 客户id_客服id json $redis->sadd('chat_log',$sendMgs); }); //$redis = new Swoole\Coroutine\Redis(); //$redis->connect('127.0.0.1', 6393); //$redis->auth('88myP3CJmR!rc7#a'); //$fd = $redis->get("kf_{$message['to']}"); //$server->push(intval($fd),json_encode(['type'=>'onetone','data'=>$message['msg'],'from'=>$message['from'],'to'=>$message['to']])); /*foreach ($server->connections as $conn){ //$server->push($conn,$msg); $server->push($conn,json_encode(['type'=>'onetone','data'=>$message['msg'],'from'=>$message['from'],'to'=>$message['to']])); }*/ break; case 'stoc': go(function () use($server,$message) { $redis = new Swoole\Coroutine\Redis(); $redis->connect('127.0.0.1', 6393); $redis->auth('88myP3CJmR!rc7#a'); $fd = $redis->get("customer_{$message['to']}"); $self = $redis->get("kf_{$message['from']}"); $sendMgs = json_encode(['type'=>'onetone','data'=>htmlspecialchars($message['msg']),'from'=>$message['from'],'to'=>$message['to'],'ctime'=>time(),'is_read'=>'1','id'=>$this->msectime()]); //1未读2已读 $server->push(intval($fd),$sendMgs); $server->push(intval($self),$sendMgs); //记录存入redis 数据格式 客户id_客服id json $redis->sadd('chat_log',$sendMgs); }); break; case 'bind': $res = $server->bind(intval($frame->fd),intval($message['uuid'])); $this->uuid = $message['uuid']; //echo "bind ".intval($this->uuid)."->".$frame->fd."\r\n"; if($res){ $server->push($frame->fd,json_encode(['type'=>'bind_success','info'=>$frame->fd])); }else{ $server->push($frame->fd,json_encode(['type'=>'bind_error'])); } break; case 'online': foreach ($server->connections as $conn){ $server->push($conn,json_encode(['type'=>'online'])); } break; case 'online_num': $num =0; $list = []; foreach($server->connections as $conn){ ++$num; //echo $conn."\r\n"; $list[] = $conn; } $server->push($frame->fd,json_encode(['type'=>'online_num','info'=>$num,'list'=>$list])); break; case 'live': foreach ($server->connections as $conn){ $server->push($conn,json_encode(['type'=>'live','data'=>$message['data']])); } break; } //var_dump($message); //echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; //$server->push($frame->fd, "this is server"); } 请将代码粘贴至此处(请勿用截图) ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 结果是我客户端断线重连后服务器返回收到ping的消息我客户端可以正常收到触发onmessage
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2020-07-20
鲁飞
代码格式重新编辑下,最好发最简复现代码
赞
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一直是同一个。没用使用到多进程啊。