Можно ли организовать поток через сокет с помощью php ?
0. Правильно ли я понимаю, что на одном порту может быть только один сокет ?
1.
Можно ли организовать live поток:
отправитель -> php -> сокет
получатель <- php <- сокет
и если да, то как это лучше сделать ?
(применение: пользовательS1 двигает div мышкой, пользовательR1 видит
изменения в окне броузера).
2.
Можно ли слушать сокет несколькими открытыми php страницами и отображать
приходящие пакеты на каждой ?
(применение: создание следующей пары работающей на тех же ip:port)
Подробнее:
1b.
Пока получилось посылать и получать данные через "nc -l 127.0.0.1 -p
8085", но сокет, к сожалению, закрывается после первого же сообщения
полученного или отправленного через php.
Пример:
sender.php:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$sourceips = '127.0.0.1';
$port = 8085;
$request = 'send 1234';
socket_connect($socket, '127.0.0.1', $port);
socket_write($socket, $request); //socket_send или socket_sendto
ситуации не меняет
либо
receiver.php
--//--
$buf = "";
socket_recv($socket, $buf, 10, MSG_WAITALL);
Но как и читать и писать в сокет разными php непонятно - ни один из них
не ждет другого, в отличие от nc который может как подождать и получить
данные, так и дождаться пока их у него заберут.
2b.
Если ограничетcя только nc и запустить сервер и клиент:
nc -l 127.0.0.1 -p 8085
nc 127.0.0.1 8085
то второй клиент уже не сможет подключиться к сокету (nc или php).
Значит ли это, что невозможно слушать один сокет множеством php
страницек и отфильтровывать сообщения grep_ом ?
-----------------------------------------------------------------------
Напрямую к вопросу не относится, но может быть поможет понять задачу:
на предыдущем этапе получилось организовать поток без сокетов:
отправитель -> php -> mysql
получатель <- php <- mysql
причем "отправляется" запросами ".php?data=xxx", а "получается" потоком,
благодаря: function force_flush(){ ob_end_flush(); flush(); }
function loop($session_id){
$get_lines=mysql_query("SELECT p_data FROM `table_е` WHERE `session_id`
= '$session_id'");
if($data=mysql_fetch_row($get_lines)) {
$pkg = $data[0];
echo $pkg;
force_flush(); // !
usleep(500000);
}else{ echo 'no data <br>'; }
loop($session_id);
}
причем этот поток, в дальнейшем, отлично читается, благодаря
jquery.ajaxstream.js
Так что осталось избавиться от sql и http, перейдя к сокетам.
Это возможно ?
--
Sincerely,
Nicholas
Reply to: