【问题标题】:PHP Websocket failed: Error during WebSocket handshake: net::ERR_CONNECTION_CLOSED (anonymous)PHP Websocket 失败:WebSocket 握手期间出错:net::ERR_CONNECTION_CLOSED(匿名)
【发布时间】:2020-07-09 11:24:11
【问题描述】:

我在 PHP 中学习 websocket,但我不知道为什么会出现这个握手错误。

我的客户端.html:

<html>
<body>
    <div id="root"></div>
    <script>
        var host = 'ws://127.0.0.1:8020/';
        var socket = new WebSocket(host);
        socket.onmessage = function(e) {
            console.log(e.data)
        };
    </script>
</body>
</html>

还有 server.php :

<?php

$address = "127.0.0.1";
$port = 8020;

$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_bind($socket,$address,$port) or die('bind error');
socket_listen($socket) or die('listen error');
$client = socket_accept($socket) or die('accept error');

$socketread = socket_read($client,5000) or die('Failed to read');

preg_match("#Sec-WebSocket-Key: (.*)\r\n#",$socketread,$match);
$key = base64_encode(sha1($match[1].'258EAFA5-E914-47DA-95CA-C5AB0DC85B11',true));

$header = "HTTP/1.1 101 Switching Protocols\r\n";
$header .= "Upgrade: websocket\r\n";
$header .= "Connection: Upgrade\r\n";
$header .= "Sec-WebSocket-Accept: $key\r\n";
$header .= "Sec-WebSocket-Version: 13\r\n";

var_dump($header);
socket_write($client,$header,strlen($header));


$msg = "connected";
socket_write($client,$msg,strlen($msg));
socket_close($socket);

但是,我在握手时遵循了 Mozilla 文档:/

谢谢你。

【问题讨论】:

    标签: php sockets websocket php-socket


    【解决方案1】:

    但是,我在握手时遵循了 Mozilla 文档:/

    虽然这可能是您根据您的代码假设只需要开始时的握手并且您可以直接使用普通套接字。但是 WebSockets 实际上有自己的消息结构和有效负载屏蔽,你也需要实现这些。详情请见the actual standard

    【讨论】:

    • 对不起,我不明白:/
    • 以及为什么此代码有效但我的代码无效? medium.com/@cn007b/…
    • @Errorj404:注意到您引用的代码中的chr(129) . chr(strlen($content)) 了吗?这就是 Websockets 框架。从服务器到客户端的消息很简单,但从客户端到服务器的消息更复杂。再次,阅读标准而不是仅仅猜测协议是如何工作的。这就是标准的实际用途。
    • 我的错误在这一行 -> $header .= "Sec-WebSocket-Accept: $key\r\n\r\n";为了不出现握手错误,我必须在 Websocket-Accept 标头中添加两个“\r\n”,为什么?为什么 chr(129) 而不是 chr(127) ?位数相同。
    • @Errorj404:这些都是 HTTP 和 WebSockets 标准的要求。同样,如果您想自己实现所有这些东西而不是依赖现有的库,请阅读标准,不要试图猜测它是如何工作的。
    【解决方案2】:

    您的要求仍然相关吗?

    我发送:

    $key = base64_encode(sha1($match[1].'258EAFA5-E914-47DA-95CA-C5AB0DC85B11',true));
    $header = "HTTP/1.1 101 Switching Protocols\n\r"
                            ."Upgrade: websocket\n\r"
                            ."Connection: Upgrade\n\r"
                            ."Sec-WebSocket-Accept: ".base64_encode(sha1($cartouche['Sec-WebSocket-Key'].'258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true))."\n\n\r";
    

    我最终得到 2 个 \n\n\r。

    这部分不能工作:

    $msg = "connected";
    socket_write($client,$msg,strlen($msg));
    socket_close($socket);
    

    你必须尊重框架

     0               1               2               3
     0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
    +-+-+-+-+-------+-+-------------+-------------------------------+
    |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
    |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
    |N|V|V|V|       |S|             |   (if payload len==126/127)   |
    | |1|2|3|       |K|             |                               |
    +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
     4               5               6               7
    + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
    |     Extended payload length continued, if payload len == 127  |
    + - - - - - - - - - - - - - - - +-------------------------------+
     8               9               10              11
    + - - - - - - - - - - - - - - - +-------------------------------+
    |                               |Masking-key, if MASK set to 1  |
    +-------------------------------+-------------------------------+
     12              13              14              15
    +-------------------------------+-------------------------------+
    | Masking-key (continued)       |          Payload Data         |
    +-------------------------------- - - - - - - - - - - - - - - - +
    :                     Payload Data continued ...                :
    + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
    |                     Payload Data continued ...                |
    +---------------------------------------------------------------+
    

    【讨论】:

      猜你喜欢
      • 2017-05-09
      • 2017-02-12
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      相关资源
      最近更新 更多