使用 AsyncTcpConnection 作为Websocket客户端,连接 wss://example.com/aaa/bbb?a=xxx&b=yyy
ws服务端在建立连接之后需要立即发送鉴权信息。然后进行业务请求。
目前问题表现为: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);
//发送鉴权信息
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();
};
返回头里有 HTTP/1.1 401 No ticket,
找下对方接口的文档,看下ticket是什么,怎么传
js版本的代码可以正常运行。ticket这段代码是js和php版本公用的。不会有问题。
研究了一下。
js中 WebSocket.onopen 是在ws连接建立后才会触发。
所以应该是 workerman的 ws都没连接成功。不牵扯到发送的鉴权问题。。
应该是在第一个ws握手请求的时候就是鉴权失败了。
在这里url里携带的有鉴权信息。。。。。
1.先确认是否链接成功。
2.如果链接成功,确实是否在发送鉴权数据时的问题,比如$conn->send($xxx,true);