我的代码大致如下:
$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 是异步的,但是我又看不出来个所以然,所以请大神指点一下,谢谢。
1、onConnect回调是是在TCP三次握手成功之后触发;
2、onWebSocketConnect回调则是在TCP三次握手成功之后的websocket握手阶段触发;
很明显这是一个同步的过程、也是websocket协议的工作原理、所以也很好的解释了你代码为什么这样报错的原因。