好的,如果您的 server.php 文件正在运行,并且您可以看到它使用netstat 在端口上侦听,那么首先只需使用ws://example.com:1234 进行连接。接下来,您说“客户等待很长时间,但一无所获”如果是这种情况,握手过程很可能有问题。我第一次开始在 php 中使用套接字时遇到了同样的问题。当 javascript 连接到 websocket 时,它会在标头中发送一个特定的键,它看起来像这样:
Sec-WebSocket-Key: 9a9dufa9dfa90fa
你必须把它从标题中拉出来,在上面附加一个字符串(是的,你必须使用那个确切的字符串258EA...)然后sha1()它然后将它转换为base64,如下所示:
if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $headers, $match))
$key = $match[1];
$acceptKey = $key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
$acceptKey = base64_encode(sha1($acceptKey, true));
接下来,您需要将其与其他一些信息一起写回套接字,以便 javascript 与服务器握手:
$upgrade = "HTTP/1.1 101 Switching Protocols\r\n".
"Upgrade: websocket\r\n".
"Connection: Upgrade\r\n".
"Sec-WebSocket-Accept: $acceptKey".
"\r\n\r\n";
socket_write($the_socket, $upgrade); //$the_socket comes from socket_accept()
握手完成后,在您的 javascript 中,.onopen() 函数应该触发,您可以在客户端和服务器之间来回发送数据:
var connection = new WebSocket('ws://127.0.0.1:1234');
connection.onopen = function () {
console.log('Connection Opened');
connection.send('Ping'); // Send the message 'Ping' to the server
};