我已使用以下代码实现了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协议进行连接。
答案 0 :(得分:0)
好的,我终于解决了这个问题。
由于SSL加密,它无法在我的php守护程序文件中读取套接字。所以我从下面的答案得到解决方案 https://serverfault.com/questions/804862/apache-mod-proxy-forward-secure-websocket-to-non-secure
我们可以在apache中使用代理传递,因此它将使用/ websocket将所有请求发送到其他ws:// host:port / 在此之后它完美运作。
还要确保域名不使用代理,因为我的上述解决方案无效但从DNS设置中删除代理后,它开始工作。