Как вызвать WebSocket программно (используя PHP)? - PullRequest
6 голосов
/ 19 апреля 2011

У меня есть ситуация, когда мне нужно обновить одно окно браузера на основе входных данных другого.Прямо сейчас я использую 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
    } 

Ответы [ 5 ]

3 голосов
/ 19 апреля 2011

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

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);
1 голос
/ 19 апреля 2011

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

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

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

0 голосов
/ 12 октября 2013

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

0 голосов
/ 09 декабря 2012

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

В phpwebsocket это было бы примерно так:

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

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

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

0 голосов
/ 19 апреля 2011

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

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

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

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

...