来自客户端的PHP套接字头

时间:2018-09-06 18:26:13

标签: php sockets websocket

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

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

当我想从 javascript客户端进行连接时,它可以正常工作,并打印所有标头,例如Sec-WebSocket-Key。这就是我在套接字服务器中使用doHandShake方法的方法:

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

另一方面,我有一个php客户端。当我从php客户端连接时,标头是我发送到服务器的字符串,而不是真正的标头。这是我在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 个答案:

答案 0 :(得分:2)

JavaScript客户端(浏览器?)正在发出带有Upgrade标头的HTTP请求以协商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客户端比尝试编写自己的WebSocket客户端要好得多。