PHP套接字stdin附加到收到的数据

时间:2012-11-21 23:50:49

标签: php sockets select stdin

我在PHP中使用套接字创建一个简单的基于命令行的聊天。它工作正常,但有一个主要问题是使它几乎无法使用。当聊天中有多个人并且一个人正在键入消息而另一个人发送消息时,键入该消息的人将收到的消息附加到他们正在键入的内容上。有没有办法解决?我正在使用stdin和流选择。这是客户的一篇文章:

$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;
      }
    }
  }
}

感谢所有帮助!谢谢!

1 个答案:

答案 0 :(得分: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;
      }
    }
  }
}

缺点是当你按回车键时它只会显示传入的文字。唯一的方法是使用fgets()以外的东西。

我认为这只是一个实验 - 使用Node.js或类似的事件驱动编程对于这类事情要好得多。