首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GameServerQuery如何检查服务器是否在线&计数在线玩家?

GameServerQuery如何检查服务器是否在线&计数在线玩家?
EN

Stack Overflow用户
提问于 2019-11-18 15:00:32
回答 1查看 287关注 0票数 1

我想检查一下quake3游戏服务器是在线的还是离线的。如果脱机,则回显‘服务器离线’,如果联机,则回送‘服务器联机’。

我正在使用库:

正如您在库中看到的,已经有了一个isOnline函数,我认为这是用于服务器在线的还是不联机的?!但我不知道怎么输出。

调用游戏服务器数据的:

代码语言:javascript
运行
复制
<?php
include 'test/GameServerQuery.php';

$data = GameServerQuery::queryQuake3('1.1.1.1', 28960);

echo 'Hostname: ' . $data['sv_hostname'] . '<br />';
echo 'Players online: ' . $data['sv_maxclients'] . '<br />'; /// How can I count online players / maxclients? ex.: 0/20
echo 'Punkbuster: ' . $data['sv_punkbuster'] . '<br />';
?>

下面是库中的相关代码(万一链接死亡或更改):

代码语言:javascript
运行
复制
public static function isOnline ($host, $port, $type)
{
    if ($type == 'minecraft') { // No need for the full ping
            return @fclose (@fsockopen ( $host , $port , $err , $errstr , 2 ));
    }

    if (method_exists('GameServerQuery', 'query'.$type)) {
        return self::{'query'.$type}($host , $port);
    }

    return @fclose (@fsockopen ( $host , $port , $err , $errstr , 2 ));
}

public static function queryQuake3($host, $port)
{
    $reponse = self::ping($host, $port, "\xFF\xFF\xFF\xFFgetstatus\x00");

    if ($reponse === false || substr($reponse, 0, 5) !== "\xFF\xFF\xFF\xFFs") {
        return false;
    }

    $reponse = substr($reponse, strpos($reponse, chr(10))+2);

    $info = array();
    $joueurs = substr($reponse, strpos($reponse,chr(10))+2);
    $reponse = substr($reponse, 0, strpos($reponse, chr(10)));

    while($reponse != ''){
        $info[self::getString($reponse, '\\')] = self::getString($reponse, '\\');
    }

    if (!empty($joueurs)) {
        $info['players'] = array();
        while ($joueurs != ''){
            $details = self::getString($joueurs, chr(10));
            $info['players'][] = array('frag' => self::getString($details, ' '),
                                                     'ping' => self::getString($details, ' '),
                                                     'name' => $details);
        }
    }
    return $info;
}

private static function ping($host, $port, $command)
{
    $socket = @stream_socket_client('udp://'.$host.':'.$port, $errno, $errstr, 2);
    if (!$errno && $socket) {
        stream_set_timeout($socket, 2);
        fwrite($socket, $command);
        $buffer = @fread($socket, 1500);
        fclose($socket);
        return $buffer;
    }
    return false;
}

private static function getString(&$chaine, $chr = "\x00")
{
    $data = strstr($chaine, $chr, true);
    $chaine = substr($chaine, strlen($data) + 1);

    return $data;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-18 16:13:59

它是一个静态函数,就像您已经调用的那个函数一样。我想,这样的事情可以做得到:

代码语言:javascript
运行
复制
$result = GameServerQuery::isOnline('1.1.1.1', 28960, "Quake3");
print_r($result);

这会告诉你你会得到什么结果。我怀疑它实际上将与queryQuake3函数相同,因为如果您将"Quake3“指定为最后一个参数,则isOnline函数将直接调用"queryQuake3”函数并将结果直接传回。

因此,如果服务器离线或没有响应,该函数应该返回false,如果服务器处于联机状态,则返回true,或者返回更复杂的数据集。

所以事实上我觉得你可以写:

代码语言:javascript
运行
复制
$result = GameServerQuery::isOnline('1.1.1.1', 28960, "Quake3");
if ($result === false) {
  echo "Server is offline";
}
else {
  echo "Server is online";
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58917399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档