请问 $worker->onConnect 和 $connection->onWebSocketConnect 是异步的吗?

小七他哥

我的代码大致如下:

$worker->onConnect = function (\Workerman\Connection\TcpConnection $connection) {
    $connection_ip = $connection->getRemoteIp();

    $connection->onWebSocketConnect = function ($connection, $http_header) use ($connection_ip) {
        if (!isset($_GET['sid']) || !isSid($_GET['sid'])) {
            $connection->close_reason = $connection_ip . '链接服务器的时候缺失 sid 参数';
            $connection->close("\r\n");
            return false;
        }

        $connection->sid = $_GET['sid'];

        if (isset($_GET['cpage'])) {
            if (strlen($_GET['cpage']) > 100) {
                $connection->close_reason = $connection_ip . '链接服务器的时候 cpage 参数字符串过长';
                $connection->close("\r\n");
                return false;
            }

            $connection->cpage = urldecode($_GET['cpage']);
        }

        if (isset($_GET['refer'])) {
            if (strlen($_GET['refer']) > 180) {
                $connection->close_reason = $connection_ip . '链接服务器的时候 refer 参数字符串过长';
                $connection->close("\r\n");
                return false;
            }

            $connection->refer = urldecode($_GET['cpage']);
        }
    };

    $connection->maxSendBufferSize = 10485760;
    $connection->uniqueId = $connection->getLocalIp() . '-' . $connection->getLocalPort() . '-' . $connection->worker->id . '-' . $connection->id;

    try {
        if (empty($connection->sid)) {
            throw new Exception('ip=' . $connection_ip . ',unique_id=' . $connection->uniqueId . ' 的用户无 sid 属性,直接关闭该链接', 1038);
        }

        $connection->maxSendBufferSize = 10485760;
        $connection->uniqueId = $connection->getLocalIp() . '-' . $connection->getLocalPort() . '-' . $connection->worker->id . '-' . $connection->id;

        addToIpList($connection, $connection_ip);

        wlog('new connection sid = ' . $connection->sid . ' from ip ' . $connection_ip, false, 1, $GLOBALS['system_set']);
    } catch (Exception $exception) {
        $connection->close_reason = $exception->getMessage() . ':' . $exception->getCode();
        $connection->close("\r\n");
    }
};

按代码预期,wss 链接里面没有传 sid 参数的话,应该报:

链接服务器的时候缺失 sid 参数

这个错误,但是实际上我的环境报了一大堆的:

[2021-07-19 15:27:38] sid=, unqiue_id=172.17.215.105-9502-0-330 的用户关闭连接,关闭原因:ip=121.32.108.228,unique_id=172.17.215.105-9502-0-330 的用户无 sid 属性,直接关闭该链接:1038
[2021-07-19 15:27:38] sid=, unqiue_id=172.17.215.105-9502-0-331 的用户关闭连接,关闭原因:ip=113.116.193.26,unique_id=172.17.215.105-9502-0-331 的用户无 sid 属性,直接关闭该链接:1038
[2021-07-19 15:27:39] sid=, unqiue_id=172.17.215.105-9502-0-332 的用户关闭连接,关闭原因:ip=113.116.193.26,unique_id=172.17.215.105-9502-0-332 的用户无 sid 属性,直接关闭该链接:1038

这样的错误,因此怀疑$worker->onConnect 和 $connection->onWebSocketConnect 是异步的,但是我又看不出来个所以然,所以请大神指点一下,谢谢。

1314 1 0
1个回答

blogdaren

1、onConnect回调是是在TCP三次握手成功之后触发;
2、onWebSocketConnect回调则是在TCP三次握手成功之后的websocket握手阶段触发;
很明显这是一个同步的过程、也是websocket协议的工作原理、所以也很好的解释了你代码为什么这样报错的原因。

  • 暂无评论
年代过于久远,无法发表回答
🔝