2

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

$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 中等待完整字符串时,代码都会向标准输出输出一条消息。

解决这个问题的唯一方法是将文本放入变量 ($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 或类似的事件驱动编程对于这类事情会好得多。

于 2012-11-22T23:51:41.647 回答