Как вызвать WebSocket программно (используя PHP)?

У меня есть ситуация, когда мне нужно обновить одно окно браузера на основе ввода другого. Сейчас я использую WebSockets, и он отлично работает.

Теперь я хочу отправить данные в WebSocket с помощью PHP вместо браузера (поэтому вместо ws: // используйте PHP-код). Другими словами, я хочу имитировать вызов WebSocket.send (), используя PHP вместо JavaScript.

У меня есть следующий код, который, похоже, не работает (onmessage не вызывается):

if ( function_exists('socket_create') AND $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) AND $sock_data = socket_connect($sock, "127.0.0.1", 12345) ) { $msg = "hello world"; $sock_data = socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1); //Set $sock_data = socket_write($sock, $msg, strlen($msg)); //Send data socket_close($sock); //Close socket } 

Вот как это делается:

http://permalink.gmane.org/gmane.comp.lang.javascript.nodejs/18088

 $host = 'localhost'; //where is the websocket server $port = 9000; $local = "http://localhost/"; //url where this script run $data = 'hello world!'; //data to be send $head = "GET / HTTP/1.1"."\r\n". "Upgrade: WebSocket"."\r\n". "Connection: Upgrade"."\r\n". "Origin: $local"."\r\n". "Host: $host"."\r\n". "Content-Length: ".strlen($data)."\r\n"."\r\n"; //WebSocket handshake $sock = fsockopen($host, $port, $errno, $errstr, 2); fwrite($sock, $head ) or die('error:'.$errno.':'.$errstr); $headers = fread($sock, 2000); fwrite($sock, "\x00$data\xff" ) or die('error:'.$errno.':'.$errstr); $wsdata = fread($sock, 2000); //receives the data included in the websocket package "\x00DATA\xff" fclose($sock); 

Чтобы отправить данные в сокет, вам нужно использовать fsockopen, чтобы открыть соединение с сокетом на указанном порту. Если соединение успешно, все, что вам нужно сделать, это использовать fwrite

Однако вы собираетесь отправлять данные на сервер WebSocket. Сервер будет рассматривать вас как клиента, и поскольку вы не предоставляете HTTP-заголовки, он ожидает успешной аутентификации – ваше соединение будет отклонено.

Поскольку вы не сказали, кто должен получать сообщение, которое вы пытаетесь отправить (все пользователи или конкретный пользователь или что-то совсем другое), не зная, какова ваша цель, трудно объяснить, что вы должны делать.

В WebSockets гораздо больше, чем просто отправка необработанных данных в сокет TCP.

Итак, для начала вы используете сокет UDP, где WebSockets использует TCP. WebSockets – это целый протокол для связи, аналогичный HTTP, поэтому вам нужно следовать этому протоколу, есть шаг рукопожатия, который вам нужно выполнить первым, и заголовки, которые необходимо добавить во все сообщения. Это не сложно, но я не буду вдаваться в подробности здесь.

У вас есть два варианта: реализовать протокол WebSockets в php или использовать встроенную библиотеку, подобную этой: http://code.google.com/p/phpwebsocket/

Я не груб, или имею в виду, но в будущем попробуйте быстрый поиск Google. Эта библиотека, с которой я связан, была найдена после googling «PHP WebSockets».

Наиболее важная часть заключается в том, что сообщение необходимо отправить в существующий сокет, что означает, что вы не можете вызвать socket_connect, fsockopen или любую другую функцию в PHP, которая попытается выполнить незапрашиваемое соединение с клиентом. Это не является вещью для websocket – это фундаментальная концепция сетевого программирования.

На phpwebsocket это будет примерно так:

 $msg = "hello world"; $phpwebsocket->send($user->socket, $msg); 

где «$ phpwebsocket» – это объект PHP WebSocket, $ user-> socket – это подключенный пользователь, который подключил priory с помощью javascript WebSocket (), а send () – это метод в объекте WebSocket, который будет правильно кодировать сообщение в (или должен, как это скоро потребуется).

Однако, если по какой-либо причине вы хотите подключиться к серверу websocket с помощью websockets из PHP, вам нужно проверить https://github.com/nicokaiser/php-websocket . Сервер в ссылке не будет иметь никакого значения, если вы довольны своим текущим решением, но пакет также содержит класс клиента PHP Websocket, который вам нужен.

Хранение с проверкой Вы можете использовать что-то вроде telnet с popen / proc_open для связи с сервером сокета.