Объединение потоковых сокетов php с eventSource

Я пытаюсь узнать о сокетах в PHP, и много чтения привело меня к stream_socket_server(),

Я получил базовый чат, работающий между двумя терминалами в Linux, используя код, похожий на приведенный ниже, и надеялся, что моим следующим шагом будет создание чата или системы уведомлений в Интернете.

То, что я ожидал, произойдет:

Слушатель события в eventSource.html будет прослушивать событие в цикле while и выводить сообщение, полученное от терминала linux, на котором запущен server.php

Что происходит:

Все с точки зрения eventSource.html работает как надо. Так что, если бы мне пришлось убрать всю цель этого и просто заменить сообщение стандартной строкой Hello World тогда это успешно выводит <li>message:{Hello World}</li> каждую секунду.

Однако, как только я пытаюсь прочитать данные из терминала, ничего не появляется, кроме <li>message: {}</li> каждую секунду. Стоит отметить, что когда я запускаю server.php, он ждет клиента, а когда я запускаю eventSource.html, он успешно соединяется.

Я неправильно понимаю, как это работает? Я предполагал, что каждую секунду в цикле while он будет искать данные в этом потоке.

Или я иду по совершенно неправильному пути с точки зрения изучения сокетов.

server.php (я загружаю это из терминала в Linux)

<?php
$PORT = 20226;          //chat port
$ADDRESS = "localhost"; //adress
$ssock;     //server socket
$csock;     //chat socket
$uin;       //user input file descriptor

$ssock = stream_socket_server("tcp://$ADDRESS:$PORT");      //creating the server sock

echo "Waiting for client...\n";
$csock = stream_socket_accept($ssock);          //waiting for the client to connect
//$csock will be used as the chat socket
echo "Connection established\n";

$uin = fopen("php://stdin", "r");       //opening a standart input file stream

$conOpen = true;    //we run the read loop until other side closes connection
while($conOpen) {   //the read loop

$r = array($csock, $uin);       //file streams to select from
$w = NULL;  //no streams to write to
$e = NULL;  //no special stuff handling
$t = NULL;  //no timeout for waiting

if(0 < stream_select($r, $w, $e, $t)) { //if select didn't throw an error
foreach($r as $i => $fd) {  //checking every socket in list to see who's ready
if($fd == $uin) {       //the stdin is ready for reading
$text = fgets($uin);
fwrite($csock, $text);
}
else {                  //the socket is ready for reading
$text = fgets($csock);
if($text == "") {   //a 0 length string is read -> connection closed
echo "Connection closed by peer\n";
$conOpen = false;
fclose($csock);
break;
}
echo "[Client says] " .$text;
}
}
}
}

client.php загружается из eventSource.html ниже

<?php

date_default_timezone_set("America/New_York");
header("Content-Type: text/event-stream\n\n");
$PORT = 20226;    //chat port
$ADDRESS = "localhost"; //adress

$sock = stream_socket_client("tcp://$ADDRESS:$PORT");
$uin = fopen("php://stdin", "r");

while (1) {
$text = fgets($uin);

echo 'data: {'.$text.'}';
echo "\n\n";


ob_end_flush();
flush();
sleep(1);

}

eventSource.html

<script>
var evtSource = new EventSource("client.php");

evtSource.onmessage = function(e) {
var newElement = document.createElement("li");

newElement.innerHTML = "message: " + e.data;
var div = document.getElementById('events');
div.appendChild(newElement);
}
</script>
<div id="events">
</div>

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector