2

PHPでソケットを使用して、単純なコマンドラインベースのチャットを作成しています。それは問題なく動作しますが、ほとんど使用できなくなるという1つの主要な問題があります。チャットに複数の人がいて、1人がメッセージを入力し、もう1人がメッセージを送信する場合、メッセージを入力する人は、受信したメッセージを入力内容に追加して受け取ります。とにかくこれの周りにありますか?stdinとstreamselectを使用しています。これがクライアントからの作品です:

$uin = fopen("php://stdin", "r");
while (true) {
  $r = array($socket, $uin);
  $w = NULL;
  $e = NULL;

  if (0 < stream_select($r, $w, $e, 0)) {
    foreach ($r as $i => $fd) {
      if ($fd == $uin) {
        $text = (fgets($uin));
        fwrite($socket, $text);
      } else {
        $text = fgets($socket);
        print $text;
      }
    }
  }
}

すべての助けに感謝します!ありがとう!

4

1 に答える 1

0

コードは、完全な文字列が $socket で待機するたびに、メッセージを stdout に出力します。

これを回避する唯一の方法は、テキストを印刷する代わりに変数 ($outtext) に入れることです。次に、送信ソケットに書き込む前など、いつでも読み取る準備ができたら表示できます...

$uin = fopen("php://stdin", "r");
while (true) {
  $r = array($socket, $uin);
  $w = NULL;
  $e = NULL;
  $outtext = '';

  if (0 < stream_select($r, $w, $e, 0)) {
    foreach ($r as $i => $fd) {
      if ($fd == $uin) {
        $text = (fgets($uin));
        print $outtext;
        $outtext = '';
        fwrite($socket, $text);
      } else {
        $text = fgets($socket);
        $outtext .= $text;
      }
    }
  }
}

欠点は、Enter キーを押したときに受信テキストのみが表示されることです。これを回避する唯一の方法は、fgets() 以外のものを使用することです。

これは単なる実験であると想定しています.Node.jsなどを使用したイベント駆動型プログラミングは、この種のことにははるかに適しています.

于 2012-11-22T23:51:41.647 に答える