在websocket server里面使用定时想客户端发送了ping命令的问题

在websocket server里面使用定时想客户端发送了ping命令的问题,

$server->tick(1000,function() use ($server,$request) {
             $fd=$request->fd;
            $server->push($fd,"ping",9);
});

由于将websocket client给关闭了,然后报

 swoole_websocket_server::push(): the connected client of connection[1] is not a websocket client

看了文档https://wiki.swoole.com/wiki/page/490.html,要使用swoole_server::connection_info($fd)来判断是否是有效的websocket client,wiki地址是https://wiki.swoole.com/wiki/page/p-connection_info.html

wiki上写明要根据 其中的websocket_status来判断,但是输出connection_info信息后,发现client关闭前后websocket_status这个值都是3, 那么应该依据什么值来判断是否是一个websocket client呢

2017-08-18 18:17
0
0

nightingale

赞同来自:

已经解决了,因为使用了nginx代理了websocket,所以代理以后不能持久连接了,默认隔60秒就断开连接,所以就利用定时器,每一秒钟让websocket server向客户端发送ping数据类型,在server的close()回调中清除这个定时器即可解决,还有个小问题的是,每一个client链接server时都建立了定时器,按理每个client对应的定时器id应该不一样的,但是三个client先后链接上server以后,出现的定时器id为1,1,2,所以有点奇怪,测试结果应该是不影响使用的

2017-08-21 15:30
0

nightingale

赞同来自:

看来没人回答,对这个答案进行补充一下,

$server->tick(1000,function($id) use ($serv,$request) {
            $fd=$request->fd;
            **$flag= $serv->exist($curr_fd)==false || $serv->push($curr_fd,"ping",0x9)==false;
            if($flag) $serv->clearTimer($id);**
});

如果客户端突然主动断开连接,则server的定时器发送ping命令就会出现描述的问题,使用$serv->exist来判断是否已断开通客户端的链接或者push失败,也清除定时器

2017-08-25 16:40

要回复问题请先登录注册