首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将PHP-7套接字用作WebSocket服务器时可能出现的编码问题

将PHP-7套接字用作WebSocket服务器时可能出现的编码问题
EN

Stack Overflow用户
提问于 2020-04-06 06:54:04
回答 1查看 200关注 0票数 0

当尝试使用PHP7.3作为WebSockets的SocketServer时,我遇到了一个问题,从火狐发送的消息传出,套接字完全混乱。而且总是不同的。

但是,从PHP发送到Firefox的消息是可以的。

例如:

代码语言:javascript
复制
socket.onopen = function(e)
{
    e.target.send(JSON.stringify({"sessionid" : "5e8a2f30a164e", "sockid" : "5e8a5c8cd99e6"}));
}

一次就变成了

代码语言:javascript
复制
)'JR9ZT#GN.Fx+/9JL#
                            hL+J)/
                                  Z

下一次是

代码语言:javascript
复制
ZXC!+&)1,4<a`m&bj%i9rl=av+,91'xzv?9v9;'c=ux

客户端请求:

代码语言:javascript
复制
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

服务器代码提示

代码语言:javascript
复制
    $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]
    }

孩子:

代码语言:javascript
复制
    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";
        }

我现在有点不知所措,非常感谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2020-04-06 23:39:02

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

this postfunction unmask($payload)帮助我解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61050594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档