连接失败错误:“WebSocket连接到'ws://127.0.0.1:8080/'失败”在WebSocket中使用PHP,JavaScript

fcwjkofz  于 8个月前  发布在  PHP
关注(0)|答案(1)|浏览(771)

我目前正在学习在客户端使用PHP和JavaScript实现Websockets。我在浏览器控制台收到连接失败错误:
WebSocket连接到“wss://127.0.0.1:8080/”失败
我是新的websockets和无法找出连接失败的原因。网上的资料没有发现有帮助,所以我决定在这里发布一个问题。您的建议,提示,故障排除将不胜感激。
JavaScript:client.html

<script type="text/javascript">
 var conn = new WebSocket('ws://127.0.0.1:8080'); 
 conn.onopen = function(e){
  console.log("Connection established");
 };
</script>

PHP:进程控制扩展-Manual

<?php
 $host = "127.0.0.1";
 $port = 8080;
 $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die('Not created');
 $result = socket_bind($socket, $host, $port) or die('Not bind');
 $result = socket_listen($socket,3) or die('Not listen');
 do
 {
  $accept = socket_accept($socket) or die('Not accept');
  $msg = socket_read($accept, 1024);
  $msg = trim($msg);
  echo $msg;
  echo "Enter reply";
  $reply = fgets(STDIN);
  socket_write($accept, $reply, strlen($reply));
 }while(true);
?>
ioekq8ef

ioekq8ef1#

首先:Your client.html says:

var conn = new WebSocket('ws://127.0.0.1:8080');

(non安全连接),但您的错误消息说:
WebSocket连接到“wss://127.0.0.1:8080/”失败
(安全连接尝试)。确保通过不安全的连接执行client.html,否则任何尝试建立不安全的WebSocket连接的尝试都将失败。
如果在握手完成之前与PHP服务器的连接丢失或收到握手响应以外的其他内容,您也会收到“WebSocket connection to 'ws://127.0.0.1:8080/' failed”错误消息。只有在握手完成后,“conn.onopen”才会触发。
试试下面的server.php(基于您的代码)

<?php

class WebsocketHelper {
    public static function parseHeadersFromRequest(string $request) : array {
        $header_values = [];
        $header_lines = explode("\r\n", explode("\r\n\r\n", $request)[0]);
        foreach($header_lines as $header_line) {
            $key_values = explode(":", $header_line, 2);
            $header_values[trim($key_values[0])] = empty($key_values[1]) ? null : trim($key_values[1]);
        }
        return $header_values;
    }

    public static function createAcceptFromKey(string $key) : string {
        $key .= '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
        $key = sha1($key, true);
        return base64_encode($key);
    }

    public static function createResponse(string $accept_hash) : string {
        $response  = "HTTP/1.1 101 Switching Protocols\r\n";
        $response .= "Upgrade: websocket\r\n";
        $response .= "Connection: Upgrade\r\n";
        $response .= "Sec-WebSocket-Accept: {$accept_hash}\r\n";
        return $response . "\r\n";
    } 
}

$host = "127.0.0.1";
$port = 8080;
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die('Not created');
$result = socket_bind($socket, $host, $port) or die('Not bind');
$result = socket_listen($socket,3) or die('Not listen');

$accept = socket_accept($socket) or die('Not accept');
$msg = socket_read($accept, 2048);

$msg = trim($msg);
echo $msg . PHP_EOL;

$headers = WebsocketHelper::parseHeadersFromRequest($msg);
$accept_hash = WebsocketHelper::createAcceptFromKey($headers['Sec-WebSocket-Key']);
$reply = WebsocketHelper::createResponse($accept_hash);

socket_write($accept, $reply, strlen($reply));

sleep(10);
socket_close($socket);

我已经在终端中启动了server.php,并在Chrome中导航到client.html。服务器输出显示:

GET / HTTP/1.1
Host: 127.0.0.1:8080
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36
Upgrade: websocket
Origin: http://me.local
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7
Sec-WebSocket-Key: mNxSdACO2fkrhzvaemT9Aw==

Chrome中的控制台显示:
Connection established

相关问题