1.用 telnet 127.0.0.1 9999 首次访问,则显示第一个用户访问
2.依次打开另外界面进行,则不显示内容
3.但是如果我在第一个 telnet 输入内容 这时候才会出现第二个用户访问
4.发送消息,也是如此
举例:比如 A 发消息,B、C、D 可以收到。但是实际上呢,A 发消息后,B、C、D 必须也发一条消息后,才能收到其他人的消息。
$host = "0.0.0.0";
$port = "9999";
$fd = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($fd, $host, $port);
socket_listen($fd);
$conn = [];
$writeFds = [];
$e = null;
echo PHP_EOL . PHP_EOL . "欢迎来到 select 聊天室" . PHP_EOL . PHP_EOL;
echo " tcp://{$host}:{$port}" . PHP_EOL;
echo $fd;
while (true) {
$readFds = array_merge($conn, [$fd]);
if (socket_select($readFds, $writeFds, $e, null) > 0) {
if (in_array($fd, $readFds)) {
$newConn = socket_accept($fd);
$i = intval($newConn);
$conn[$i] = $newConn;
$readFds[$i] = $newConn;
$writeFds[$i] = $newConn;
$key = array_search($fd, $readFds);
unset($readFds[$key]);
echo "第" . $i . "个用户来到聊天室" . PHP_EOL;
}
if (count($readFds) > 0) {
foreach ($readFds as $rfd) {
$line = socket_read($rfd, 2048);
foreach ($conn as $value) {
if ($rfd == $value) {
continue;
}
socket_write($value, $line, strlen($line));
}
}
}
} else {
continue;
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.