1

小程序首次连接websocket后可正常推送消息,但是重连后偶尔出现isEstablished判断当前连接无效问题。是什么问题导致?还请有经验的朋友帮忙解答一下,在此谢过!!1572791746(1).jpg### 问题描述

问题出现的环境背景及自己尝试过哪些方法

检查过多次代码,发现问题就在isEstablished()判断为无效连接问题上,但是在小程序端显示是连接正常的,消息记录也能添加到数据库当中。

相关代码

/**

 * [sendMsg 消息推送]
 * @Date   2019-10-11
 * @param  [type]     $data [description]
 * @return [type]           [description]
 */
private function sendMsg($data){
    //消息要发给谁
    $tofd = intval($data['tid']);
    //判断是否在线
    $fds = [];
    foreach($this->ws->connections as $fd){
        // 需要先判断是否是正确的websocket连接,否则有可能会push失败
        if($this->ws->isEstablished($fd)){
            array_push($fds, $fd);
        }else{
            echo('时间:【'.date('Y-m-d H:i:s').'】;websocket 连接不正确 fd无效。fd为:'.$fd."\n");
        }
    }
    if(in_array($tofd,$fds)){
        $tmp['content']  = $data['content']; //消息内容
        $returnData = json_encode($tmp);
        $this->ws->push($tofd , $returnData);
        // 记录历史记录
        $status = 1;
    }else{
        echo "sendMsg: 当前用户client-{$tofd}不在线\n";
        // 记录离线消息
        $status = 0;
    }
    // $this->addChatRocord($data,$status,$type);
}

你期待的结果是什么?实际看到的错误信息又是什么?

swoole日志当中没有任何的报错或者警告信息。

啊华 1
11月3日提问

1 个回答

0

$this->ws->isEstablished($fd) // 按理说也可以判断。
$server->connection_info($fd) // 我线上的产品主要用这个函数判断
获取连接信息,
返回的数组中有一项为 websocket_status,必须为:3 才是有效的ws客户端。否则,踢下线,让客户端重连。

我公司最近的项目核心也是使用到了websocket模块。
首次登陆确实问题很少。
掉线以后,重新上线问题比较多。
1.重新上线,js客户端立刻就会断开连接,经过分析,属于客户端主动断开,具体原因未知,后来设置最大上线次数10,重连小于10,就让客户端反复上线。
经过反复测试验证,一般重连2-3次就稳定在线不会掉了,后续消息的发送都是稳定的。

推广链接