使用 AsyncTcpConnection 作為Websocket客戶端,連接 wss://example.com/aaa/bbb?a=xxx&b=yyy
ws服務(wù)端在建立連接之后需要立即發(fā)送鑒權(quán)信息。然后進(jìn)行業(yè)務(wù)請(qǐng)求。
目前問題表現(xiàn)為:Sec-WebSocket-Accept not found. Header:
好像根本就沒有成功建立ws連接。響應(yīng)頭:
Sec-WebSocket-Accept not found. Header:
HTTP/1.1 401 No ticket
Cache-Control: max-age=0
Connection: close
Date: Sun, 11 Jun 2023 12:01:45 GMT
Pragma: no-cache
Server: daemon/3.0
Expires: Sun, 11 Jun 2023 12:01:45 GMT
調(diào)試過程中。使用JS作為客戶端連接沒問題。
JS 和 PHP代碼如下:
JS代碼
var url = "wss://example.com/aaa/bbb?a=xxx&b=yyy"
var ws = new WebSocket(url, 'binary');
ws.onopen = function() {
ws.onmessage = function(e) {
const reader = new FileReader();
reader.onload = function(event) {
const text = event.target.result;
console.log(text);
};
reader.readAsText(e.data)
};
//心跳
setInterval(function() {
ws.send("2");
}, 2*1000);
//發(fā)送鑒權(quán)信息
ws.send('username' + ':' + 'token' + "\n");
};
PHP代碼
$url = 'ws://example.com/aaa/bbb?a=xxx&b=yyy';
$worker = new Worker();
$worker->onWorkerStart = function($worker) use (&$url, &$proxy) {
$con = new AsyncTcpConnection($url);
$con->transport = 'ssl';
$con->websocketClientProtocol = 'binary';
$con->onConnect = function ($con) {
};
$con->onWebSocketConnect = function($con) use (&$proxy) {
Timer::add(2, function() use ($con) {
$con->send("2", true);
$con->send("0:" . strlen("pwd") . ":" . "pwd");
$con->send("0:" . strlen("\r") . ":" . "\r");
});
$con->send($proxy['data']['user'].':'.$proxy['data']['ticket']."\n");
};
$con->onMessage = function($con, $data) {
echo "recv: $data\n";
};
$con->onClose = function($con) {
echo "connection closed\n";
};
$con->onError = function($con, $code, $msg) {
echo "Error code:$code msg:$msg\n";
};
$con->connect();
};
研究了一下。
js中 WebSocket.onopen 是在ws連接建立后才會(huì)觸發(fā)。
所以應(yīng)該是 workerman的 ws都沒連接成功。不牽扯到發(fā)送的鑒權(quán)問題。。
應(yīng)該是在第一個(gè)ws握手請(qǐng)求的時(shí)候就是鑒權(quán)失敗了。
在這里url里攜帶的有鑒權(quán)信息。。。。。
1.先確認(rèn)是否鏈接成功。
2.如果鏈接成功,確實(shí)是否在發(fā)送鑒權(quán)數(shù)據(jù)時(shí)的問題,比如$conn->send($xxx,true);