AsyncTcpConnection连接wss出错

ROY

问题描述

使用 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();
};
610 3 0
3个回答

six

返回头里有 HTTP/1.1 401 No ticket,
找下对方接口的文档,看下ticket是什么,怎么传

  • ROY 2023-06-11

    js版本的代码可以正常运行。ticket这段代码是js和php版本公用的。不会有问题。

ROY

研究了一下。

js中 WebSocket.onopen 是在ws连接建立后才会触发。

所以应该是 workerman的 ws都没连接成功。不牵扯到发送的鉴权问题。。

应该是在第一个ws握手请求的时候就是鉴权失败了。
在这里url里携带的有鉴权信息。。。。。

  • 暂无评论
小W

1.先确认是否链接成功。
2.如果链接成功,确实是否在发送鉴权数据时的问题,比如$conn->send($xxx,true);

  • 暂无评论
🔝