Возможная проблема кодирования с использованием сокетов PHP -7 в качестве сервера WebSocket - PullRequest
0 голосов
/ 06 апреля 2020

При попытке использовать PHP7 .3 в качестве SocketServer для WebSockets я сталкиваюсь с проблемой, когда сообщение, отправленное из 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

Запрос клиента:

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

Серверный код [shorttend]:

    $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";
        }

Я в недоумении и буду признателен за вашу помощь!

1 Ответ

0 голосов
/ 06 апреля 2020

Оказывается, данные, отправленные с клиента-> сервера, всегда "маскируются" с помощью WebSockets.

function unmask($payload) из этот пост помог мне решить проблему.

...