gpt4 book ai didi

php - 解释基本的PHP Socket服务器代码

转载 作者:行者123 更新时间:2023-12-03 11:56:16 27 4
gpt4 key购买 nike

我正在尝试学习如何与套接字服务器进行聊天。

我注意到每个人都使用相同的代码(从zend开发人员专区窃取)。
问题是没有人真正解释它是如何工作的。特别是while(true){之后的密码。

这将使很多人受益,所以我希望有人可以花点时间详细解释代码(详细信息!)。

You can find the code here

最佳答案

我自己回答。我逐行检查了它。.这就是它的工作方式(我只是在while(true)循环中解释该部分。

1。

// Setup clients listen socket for reading
$read[0] = $sock;
for ($i = 0; $i < $max_clients; $i++) {
if (isset($client[$i]['sock']))
$read[$i + 1] = $client[$i]['sock'];
}

这样可以简化与$ read数组的新创建连接,以监视传入数据。
// Set up a blocking call to socket_select()
if (socket_select($read, $write = NULL, $except = NULL, $tv_sec = 5) < 1)
continue;

监视$ read数组中的新数据(我仍然不清楚这是如何工作的)
/* if a new connection is being made add it to the client array */
if (in_array($sock, $read)) {
for ($i = 0; $i < $max_clients; $i++) {
if (empty($client[$i]['sock'])) {
$client[$i]['sock'] = socket_accept($sock);
echo "New client connected $i\r\n";
break;
}
elseif ($i == $max_clients - 1)
echo "Too many clients...\r\n";
}
}

确定何时建立新连接,然后在$ client数组中找到一个空白点并添加套接字。

下一部分,我将对其进行分解以简化说明。
for ($i = 0; $i < $max_clients; $i++) { // for each client
if (isset($client[$i]['sock'])) {

遍历所有$ client数组,但仅在实际具有连接的数组上起作用。
if (in_array($client[$i]['sock'], $read)) {
$input = socket_read($client[$i]['sock'], 1024);
if ($input == null) {
echo "Client disconnecting $i\r\n";
// Zero length string meaning disconnected
unset($client[$i]);
} else {
echo "New input received $i\r\n";
// send it to the other clients
for ($j = 0; $j < $max_clients; $j++) {
if (isset($client[$j]['sock']) && $j != $i) {
echo "Writing '$input' to client $j\r\n";
socket_write($client[$j]['sock'], $input, strlen($input));
}
}
if ($input == 'exit') {
// requested disconnect
socket_close($client[$i]['sock']);
}
}
} else {
echo "Client disconnected $i\r\n";
// Close the socket
socket_close($client[$i]['sock']);
unset($client[$i]);
}

首先,它查看是否仍然有 Activity 的连接,如果没有,则将其关闭。
如果存在连接,它将读取数据;如果没有人,则这是断开连接的代码。
如果有数据,则将其传递给其他客户端(但本身)。

那是ti。希望我做对了。

关于php - 解释基本的PHP Socket服务器代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3336606/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com