基于AsyncTcpConnection实现的WS客户端reConnect 方法问题。

kinross

使用AsyncTcpConnection实现的WS客户端reConnect()在onClose回调中调用,实现断线重连. 重新连接之后打印的发送数据会根据重启的次数增加, 例如第一次就一次发送一条 第二次就一次发送2次,第三次就一次发送3条以此类推,

 public function onWorkerStart()
    {
        //ws 形式连接
        $con = new AsyncTcpConnection('ws://192.168.55.31:2000/ws');
//        $con->websocketPingInterval = 50;
        //当连接建立成功时,发送http请求数据
        $con->onConnect = function(AsyncTcpConnection $con) {
            //定时发送消息
            Timer::add(5, function () use ($con) {
                $con->send("连接成功goWebsocket\n");
            });
        };

        //返回的消息
        $con->onMessage = function(AsyncTcpConnection $con, $data) {
            echo $data;
        };

        // 当连接远程websocket服务器的连接断开时
        $con->onClose = function(AsyncTcpConnection $con){
            echo "连接关闭\n";
            $con->reConnect(5);
        };

        $con->onError = function(AsyncTcpConnection $con, $err_code, $err_msg) {
            echo "$err_code, $err_msg \n";
        };

        $con->connect();

    }

这个onClose关闭之后调用重启为什么会这样了?

793 2 0
2个回答

walkor

重连后会再次调用onConnect方法,所以你onConnect方法里定时器被重复添加了。

  • 暂无评论
walkor
$con->onConnect = function(AsyncTcpConnection $con) {
    if (empty($con->timer)) {
        //定时发送消息
        $con->timer = Timer::add(5, function () use ($con) {
            $con->send("连接成功goWebsocket\n");
        });
    }
};

改成这样

  • kinross 2022-05-23

    谢谢walkor的解答。 这样没有问题了。 我建议在workerman的AsyncTcpConnection类的reConnect 方法文档也改一下, 应该会有人也碰到这样问题。 谢谢!

  • walkor 2022-05-23

    已经增加提示

  • kinross 2022-05-23

    棒 这速度真是可以 谢谢walkor的无私奉献。

年代过于久远,无法发表回答
🔝