我启动并运行了一个TCP服务器,它同时支持许多客户端连接,以及读取和发送数据。但是,当客户端关闭连接时,服务器上会有一个延迟来检测断开连接的客户端。
//tr[@class="ListRow1" and contains(td/a, "Media Analyst")]/td/input[@value="deactivate"]
编辑I:
我刚刚在代码中添加了调试打印。当单个客户端断开连接时,服务器将从// TCP socket created here
$clients = array($socket);
while (true) {
$read = $clients; // Copy of $clients
$write = NULL;
$except = NULL;
$num_changed_sockets = socket_select($read, $write, $except, NULL);
if ($num_changed_sockets === false) {
// ...
} else if ($num_changed_sockets > 0) { // Something changed
printb("In here."); // EDIT
if (in_array($socket, $read)) { // For new connections and removing host from the $clients copy
$newsock = socket_accept($socket);
if ($newsock !== false) {
printb("Client $newsock connected");
$clients[] = $newsock;
}
$key = array_search($socket, $read);
unset($read[$key]);
}
foreach ($read as $read_socket) { // The actual problem starts here?
printb("Read part."); // EDIT
$data = socket_read($read_socket, 128);
if ($data === false) {
printb("Client $read_socket disconnected");
$key = array_search($read_socket, $clients);
socket_close($clients[$key]);
unset($clients[$key]);
continue;
}
}
}
进入无限循环。有办法解决吗?
编辑II:
客户端断开连接后,$num_changed_sockets
会给出空字符串。
编辑III:
根据上一次编辑,断开客户端,如果var_dump
返回一个空字符串似乎工作。我在PHP的网站上找到了一条说明:
注意:当没有更多数据要读取时,
socket_read
会返回零长度字符串("")。
当客户端断开连接时,这不应该返回socket_read()
吗?