Заголовки сокета Php от клиента - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть сервер сокетов, который обрабатывает соединения. Здесь у меня есть метод 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 клиента, 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 Ответ

0 голосов
/ 06 сентября 2018

Клиент JavaScript (браузер?) Делает HTTP-запрос с заголовком Upgrade для согласования соединения WebSocket. Это не просто подключение и отправка Hello Server. Если вы хотите, чтобы ваш PHP-клиент делал нечто подобное, вам нужно реализовать требуемый протокол . Запрос на обновление и протокол 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";

Вам бы намного было бы лучше найти сторонний клиент WebSocket, реализованный на PHP, а не пытаться написать свой собственный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...