我有一个处理连接的套接字服务器。这里有一个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客户端中自动完成的。
答案 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客户端要好得多。