Web套接字在javascript

时间:2018-05-29 10:37:53

标签: javascript php ssl websocket wss

我已使用以下代码实现了Web套接字

try {
        console.log('wss://' + hostname + ':' + port + endpoint);
        webSocket = new WebSocket(webSocketURL);
        webSocket.onmessage = function (event) {
            //console.log('send message successfully.');
            var obj = JSON.parse(event.data);
            append_data(obj, market_pair);
        };
    } catch (exception) {
        console.log('Exception handle!');
        console.error(exception);
    }

我的页面支持https,所以我使用的是wss协议。但问题是它给了我错误" Firefox无法在wss://domainname.com上建立与服务器的连接:4008 / order.php" 如果我将使用简单的http加载页面并在websocket中使用ws然后它工作正常但是使用wss它显示上面的错误。同样在谷歌Chrome中它也无法连接。 我的ssl证书在服务器中正确安装,我在godaddy中提供的托管和域名,他们告诉我证书安装正确。

我在php中运行服务器端套接字并且它正常工作,现在可以使用wss://

连接到该套接字端口

我发现我无法使用我的php代码进行握手,因为我的php文件在后台运行,而我通过套接字读取的内容是加密的。

function doHandshake($received_header, $client_socket_resource, $host_name, $port) {
    echo $received_header;
    $headers = array();
    $lines = preg_split("/\r\n/", $received_header);
    foreach ($lines as $line) {
        $line = chop($line);
        if (preg_match('/\A(\S+): (.*)\z/', $line, $matches)) {
            $headers[$matches[1]] = $matches[2];
        }
    }

    $secKey = $headers['Sec-WebSocket-Key'];
    echo $headers['Sec-WebSocket-Key']; 
    $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
    //$secAccept = base64_encode(sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'));
    $buffer = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
            "Upgrade: websocket\r\n" .
            "Connection: Upgrade\r\n" .
            "WebSocket-Origin: $host_name\r\n" .
            "WebSocket-Location: wss://$host_name:$port/websocket/btc_boon_pair.php\r\n" .
            "Sec-WebSocket-Accept:$secAccept\r\n\r\n";
    socket_write($client_socket_resource, $buffer, strlen($buffer));
}

这是我的握手功能$ headers [' Sec-WebSocket-Key']未定义,因为$ received_header已加密。

任何人都可以建议解决这个问题吗?我必须运行php文件作为守护进程,并希望使用wss协议进行连接。

1 个答案:

答案 0 :(得分:0)

好的,我终于解决了这个问题。

由于SSL加密,它无法在我的php守护程序文件中读取套接字。所以我从下面的答案得到解决方案 https://serverfault.com/questions/804862/apache-mod-proxy-forward-secure-websocket-to-non-secure

我们可以在apache中使用代理传递,因此它将使用/ websocket将所有请求发送到其他ws:// host:port / 在此之后它完美运作。

还要确保域名不使用代理,因为我的上述解决方案无效但从DNS设置中删除代理后,它开始工作。