我的代碼大致如下:
$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 . '鏈接服務(wù)器的時(shí)候缺失 sid 參數(shù)';
$connection->close("\r\n");
return false;
}
$connection->sid = $_GET['sid'];
if (isset($_GET['cpage'])) {
if (strlen($_GET['cpage']) > 100) {
$connection->close_reason = $connection_ip . '鏈接服務(wù)器的時(shí)候 cpage 參數(shù)字符串過長';
$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 . '鏈接服務(wù)器的時(shí)候 refer 參數(shù)字符串過長';
$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 屬性,直接關(guān)閉該鏈接', 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");
}
};
按代碼預(yù)期,wss 鏈接里面沒有傳 sid 參數(shù)的話,應(yīng)該報(bào):
鏈接服務(wù)器的時(shí)候缺失 sid 參數(shù)
這個(gè)錯(cuò)誤,但是實(shí)際上我的環(huán)境報(bào)了一大堆的:
[2021-07-19 15:27:38] sid=, unqiue_id=172.17.215.105-9502-0-330 的用戶關(guān)閉連接,關(guān)閉原因:ip=121.32.108.228,unique_id=172.17.215.105-9502-0-330 的用戶無 sid 屬性,直接關(guān)閉該鏈接:1038
[2021-07-19 15:27:38] sid=, unqiue_id=172.17.215.105-9502-0-331 的用戶關(guān)閉連接,關(guān)閉原因:ip=113.116.193.26,unique_id=172.17.215.105-9502-0-331 的用戶無 sid 屬性,直接關(guān)閉該鏈接:1038
[2021-07-19 15:27:39] sid=, unqiue_id=172.17.215.105-9502-0-332 的用戶關(guān)閉連接,關(guān)閉原因:ip=113.116.193.26,unique_id=172.17.215.105-9502-0-332 的用戶無 sid 屬性,直接關(guān)閉該鏈接:1038
這樣的錯(cuò)誤,因此懷疑$worker->onConnect 和 $connection->onWebSocketConnect 是異步的,但是我又看不出來個(gè)所以然,所以請(qǐng)大神指點(diǎn)一下,謝謝。
1、onConnect回調(diào)是是在TCP三次握手成功之后觸發(fā);
2、onWebSocketConnect回調(diào)則是在TCP三次握手成功之后的websocket握手階段觸發(fā);
很明顯這是一個(gè)同步的過程、也是websocket協(xié)議的工作原理、所以也很好的解釋了你代碼為什么這樣報(bào)錯(cuò)的原因。