使用PHP-7套接字作为WebSocket服务器的可能的编码问题

问题描述 投票:0回答:1

[当尝试将PHP7.3用作WebSockets的SocketServer时,我遇到了一个问题,即从Firefox发送的消息从套接字传出,这一切都弄糟了。而且总是不同的。

但是,从PHP发送到Firefox的消息很好。

例如:

socket.onopen = function(e)
{
    e.target.send(JSON.stringify({"sessionid" : "5e8a2f30a164e", "sockid" : "5e8a5c8cd99e6"}));
}

一次成为

)'JR9ZT#GN.Fx+/9JL#
                            hL+J)/
                                  Z

下一次是

ZXC!+&)1,4<a`m&bj%i9rl=av+,91'xzv?9v9;'c=ux

Clientrequest:

GET / HTTP/1.1
Host: 192.168.5.54:8089
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0
Accept: */*
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
Origin: http://192.168.5.54
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: uhfFVS5mhYptk6FF8jl73g==
Connection: keep-alive, Upgrade
Cookie: XDEBUG_SESSION=XDEBUG_ECLIPSE
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket

Servercode [shortend]:

    $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
    $ret = socket_bind($this->socket, $this->host, $this->port);
    $ret = socket_listen( $this->socket, 0 );
    socket_set_nonblock($this->socket);
    while ($this->isServer)
    {
        $connection = @socket_accept($this->socket);
        [... forking for new connection cont in child]
    }

儿童:

    socket_close($this->socket);
            [...]
    $request = socket_read($connection, 5000);  //creates above client request     
    preg_match('#Sec-WebSocket-Key: (.*)\r\n#', $request, $matches);
    $key = base64_encode(pack('H*', sha1($matches[1] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
    $headers = "HTTP/1.1 101 Switching Protocols\r\n";
    $headers .= "Upgrade: websocket\r\n";
    $headers .= "Connection: Upgrade\r\n";
    $headers .= "Sec-WebSocket-Version: 13\r\n";
    //$headers .= "Sec-WebSocket-Protocol: json\r\n";
    $headers .= "Sec-WebSocket-Accept: $key\r\n\r\n";

    socket_write($connection, $headers, strlen($headers));
    require_once("objs/User.php");
    $user = new User();
    // Send messages into WebSocket in a loop.
    socket_set_nonblock($connection);
    while (true) 
    {

        if(($msg = socket_read($connection, 5000)) === "")
        {
            die;
        }
        if(!empty($msg))
        {
            echo $msg."\n";
        }

我在这里很茫然,感谢您的帮助!

php sockets encoding websocket php-7
1个回答
0
投票

事实证明,从客户端->服务器发送的数据始终使用WebSockets“屏蔽”。

function unmask($payload)中的this post帮助我解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.