我在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;
}
}
}
}
感谢所有帮助!谢谢!
答案 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或类似的事件驱动编程对于这类事情要好得多。