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

PHP套接字stdin附加到接收到的数据,php,sockets,select,stdin,Php,Sockets,Select,Stdin,我正在使用PHP中的套接字创建一个简单的基于命令行的聊天。它工作正常,但有一个主要问题是它几乎无法使用。当聊天室中有多人,其中一人正在键入消息,另一人发送消息时,键入消息的人会将收到的消息附加到他们正在键入的内容中。这有什么关系吗?我正在使用stdin和streamselect。以下是一篇来自客户的文章: $uin = fopen("php://stdin", "r"); while (true) { $r = array($socket, $uin); $w = NULL; $e

我正在使用PHP中的套接字创建一个简单的基于命令行的聊天。它工作正常,但有一个主要问题是它几乎无法使用。当聊天室中有多人,其中一人正在键入消息,另一人发送消息时,键入消息的人会将收到的消息附加到他们正在键入的内容中。这有什么关系吗?我正在使用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;
      }
    }
  }
}
$uin=fopen(“php://stdin“,“r”);
while(true){
$r=阵列($socket,$uin);
$w=NULL;
$e=NULL;
如果(0$fd){
如果($fd==$uin){
$text=(fgets($uin));
fwrite($socket,$text);
}否则{
$text=fgets($socket);
打印$text;
}
}
}
}

感谢您的帮助!谢谢

每当$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;
      }
    }
  }
}
$uin=fopen(“php://stdin“,“r”);
while(true){
$r=阵列($socket,$uin);
$w=NULL;
$e=NULL;
$outtext='';
如果(0$fd){
如果($fd==$uin){
$text=(fgets($uin));
打印$outtext;
$outtext='';
fwrite($socket,$text);
}否则{
$text=fgets($socket);
$outtext.=$text;
}
}
}
}
缺点是,当您按enter键时,它将只显示传入的文本。唯一的解决方法是使用fgets()以外的其他工具


我假设这只是一个实验——使用Node.js或类似工具进行事件驱动编程会更好。

使用屏幕管理库在屏幕的不同部分显示与读取输入不同的输出。