代码之家  ›  专栏  ›  技术社区  ›  Vahid Najafi

来自客户端的Php套接字头

  •  0
  • Vahid Najafi  · 技术社区  · 6 年前

    我有一个处理连接的套接字服务器。我有一个 doHandshake 方法

    function doHandshake($received_header, $client_socket_resource, $host_name, $port) {
        var_dump($received_header);
        // do stuf here with header
    }
    

    当我想从 javascript客户端 ,它工作正常,并打印所有标题,例如 Sec-WebSocket-Key .这是我在socket server中使用doHandShake方法的方式:

    $header = socket_read($newSocket, 1024);
    $chatHandler->doHandshake($header, $newSocket, HOST_NAME, PORT);
    

    另一方面,我有一个php客户端。当我从php客户端连接时,header是我发送到服务器的字符串,而不是真正的header。以下是我的php客户端套接字:

    $host    = "127.0.0.1";
    $port    = 8090;
    $message = "Hello Server";
    echo "Message To server :".$message;
    // create socket
    $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
    // connect to server
    $result = socket_connect($socket, $host, $port) or die("Could not connect to server\n");  
    // send string to server
    socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");
    // get server response
    
    $result = socket_read ($socket, 1024) or die("Could not read server response\n");
    echo "Reply From Server  :".$result;
    // close socket
    socket_close($socket);
    

    知道如何在php客户端发送套接字头吗??

    注: 这是在中自动完成的 javascript客户端 .

    1 回复  |  直到 6 年前
        1
  •  2
  •   Community Dan Abramov    3 年前

    JavaScript客户端(浏览器?)正在使用 Upgrade 头来协商WebSocket连接。这不仅仅是连接和发送 Hello Server .如果你想让你的PHP客户端做类似的事情,你需要实现 the required protocol 。升级请求和WebSocket协议都很难实现,因此很难给出快速答案,但您可以部分模拟浏览器的操作方式:

    $message = "GET /ws HTTP/1.1\r\n" .
               "Upgrade: websocket\r\n" .
               "Origin: example.com\r\n" .
               "Sec-WebSocket-Key: blahblah\r\n" .
               "\r\n";
    

    你会的 最好是寻找用PHP实现的第三方WebSocket客户端,而不是尝试编写自己的客户端。