【问题标题】:Ping a minecraft server with javascript (no plugins)?使用 javascript(无插件)Ping 一个我的世界服务器?
【发布时间】:2013-05-15 17:10:36
【问题描述】:

我正在创建这个列出我的世界服务器的网站。基本上,我试图在显示所有这些服务器时对它们进行 ping 操作。用 php 解决这个问题对我来说并不能完全解决,ping 所有服务器需要时间,而且我知道 javascript 可以同时执行多个“ping”。我该怎么做?

我现在使用的 PHP 代码:

class minecraft_server
{
    private $address;
    private $port;

    public function __construct($address, $port = 25565){
        $this->address = $address;
        $this->port = $port;
    }

    public function get_ping_info(&$info){

        $starttime = microtime(true);
        $socket = @fsockopen($this->address, $this->port, $errno, $errstr, 1.0);
        $stoptime  = microtime(true);
        $ping = round(($stoptime-$starttime)*1000);

        if ($socket === false){
            return false;
        }

        fwrite($socket, "\xfe\x01");

        $data = fread($socket, 256);

        if (substr($data, 0, 1) != "\xff"){
            return false;
        }

        if (substr($data, 3, 5) == "\x00\xa7\x00\x31\x00"){
            $data = explode("\x00", mb_convert_encoding(substr($data, 15), 'UTF-8', 'UCS-2'));
        }else{
            $data = explode('§', mb_convert_encoding(substr($data, 3), 'UTF-8', 'UCS-2'));
        }

        if (count($data) == 3){
            $info = array(
                'version'       => '1.3.2',
                'motd'          => $data[0],
                'players'       => intval($data[1]),
                'max_players'   => intval($data[2]),
                'ping'          => $ping
            );
        }else{
            $info = array(
                'version'       => $data[0],
                'motd'          => $data[1],
                'players'       => intval($data[2]),
                'max_players'   => intval($data[3]),
                'ping'          => $ping
            );
        }

        return true;
    }
}

然后你调用函数:

$server = new minecraft_server(IP, PORT);
if (!$server->get_ping_info($info)){
    echo "Offline";
}else{
    print_r($info);
}

如何在 javascript 中创建类似的东西?

【问题讨论】:

  • JavaScript 不能调用外部域,除非它们启用了 CORS。创建一个 Web 服务,通过 Ajax 调用您的服务器可以获得状态。
  • @epascarello:这并不完全正确,有 JSONP 之类的解决方法。但除非 Minecraft 服务器公开 HTTP 接口,否则通过 JavaScript(CORS 或 JSONP)执行此操作的几率很低......
  • 我同意@epascarello,AJAX 是这里的路。合理连接上的服务器可以非常快速地执行一组 ping。
  • 为@epascarello +1。假设您有 100 人在 10 秒内访问了您的网站,那么他们的浏览器将分别向所有服务器发送 ping,服务器运营商会鄙视您。最好让您的服务器每 X 秒发送一次 一个 ping,缓存结果,并将响应报告回客户端。
  • 我认为OP需要了解服务。

标签: php javascript sockets ping minecraft


【解决方案1】:

在您的位置上,我可能会设置一个脚本,当调用该脚本时,它会 ping 选定的服务器并打印可解析的结果,然后在需要发送 ping 时使用 Ajax 调用该脚本。

【讨论】:

    猜你喜欢
    • 2016-04-13
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2019-10-29
    相关资源
    最近更新 更多