[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Можно ли организовать поток через сокет с помощью 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: