使用 AsyncTcpConnection 作為Websocket客戶端,連接 wss://example.com/aaa/bbb?a=xxx&b=yyy
ws服務端在建立連接之后需要立即發(fā)送鑒權信息。然后進行業(yè)務請求。
目前問題表現(xiàn)為:Sec-WebSocket-Accept not found. Header:
好像根本就沒有成功建立ws連接。響應頭:
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
調試過程中。使用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ā)送鑒權信息
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連接建立后才會觸發(fā)。
所以應該是 workerman的 ws都沒連接成功。不牽扯到發(fā)送的鑒權問題。。
應該是在第一個ws握手請求的時候就是鑒權失敗了。
在這里url里攜帶的有鑒權信息。。。。。