1

私は PHP のソケットについて学ぼうとしていますが、たくさん読んだ結果、stream_socket_server().

以下のようなコードを使用して、Linux の 2 つの端末間で基本的なチャットを行いました。次のステップは、Web 上にチャットまたは通知システムを構築することです。

私が期待したこと:

eventSource.html のイベント リスナーは、while ループでイベントをリッスンし、server.php を実行している Linux 端末から受信したメッセージを出力します。

何が起こっている:

eventSource.html の観点からは、すべて正常に機能しています。したがって、この目的全体を取り除き、メッセージを標準の文字列に置き換えるだけで、毎秒正常にHello World出力されます。<li>message:{Hello World}</li>

<li>message: {}</li>ただし、端末からデータを読み込もうとすると、毎秒以外は何も表示されません。server.php を実行するとクライアントを待機し、次に eventSource.html を実行すると正常に接続されることに注意してください。

これがどのように機能するかを誤解していますか?while ループでは 1 秒ごとにそのストリーム内のデータを探すと想定しました。

それとも、ソケットの学習に関して完全に間違った道を進んでいますか。

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>
4

0 に答える 0