• PHP下查询游戏《Minecraft》多人游戏 服务器的人数。


    废话不多说,直接上图:

     作为一个优雅的Minecraft服务器,肯定需要官网的嗯。

    很多服务器的官网都有显示当前服务器在线人数,延迟,每一个子服在线人数,甚至出了个流量图。

    我们不搞花里胡哨的查询人数,直接用最简单的代码去完成一个简约的人数查询。

    很好,让我们来搞吧!

    首先我们需要引用一个外部PHP文件。

    名字可以起做STATUS.CLASS.php

    然后里面加入如下代码:

      1 <?php
      2  
      3     /**
      4     * Minecraft服务器状态查询
      5     * @作者 Julian Spravil <julian.spr@t-online.de> Git地址:https://github.com/FunnyItsElmo
      6     * @本库免费使用,但不要删除作者和版权。  8     */
      9     class MinecraftServerStatus {
     10  
     11         private $timeout;
     12  
     13         public function __construct($timeout = 2) {
     14             $this->timeout = $timeout;
     15         }
     16  
     17         public function getStatus($host = '127.0.0.1', $version = '1.7.*' , $port = 25565) {
     18  
     19             if (substr_count($host , '.') != 4) $host = gethostbyname($host);
     20  
     21             $serverdata = array();
     22             $serverdata['hostname'] = $host;
     23             $serverdata['version'] = false;
     24             $serverdata['protocol'] = false;
     25             $serverdata['players'] = false;
     26             $serverdata['maxplayers'] = false;
     27             $serverdata['motd'] = false;
     28             $serverdata['motd_raw'] = false;
     29             $serverdata['favicon'] = false;
     30             $serverdata['ping'] = false;
     31  
     32             $socket = $this->connect($host, $port);
     33  
     34             if(!$socket) {
     35                 return false;
     36             }
     37  
     38             if(preg_match('/1.7|1.8/',$version)) {
     39  
     40                 $start = microtime(true);
     41  
     42                 $handshake = pack('cccca*', hexdec(strlen($host)), 0, 0x04, strlen($host), $host).pack('nc', $port, 0x01);
     43  
     44                 socket_send($socket, $handshake, strlen($handshake), 0); //give the server a high five
     45                 socket_send($socket, "x01x00", 2, 0);
     46                 socket_read( $socket, 1 );
     47  
     48                 $ping = round((microtime(true)-$start)*1000); //calculate the high five duration
     49  
     50                 $packetlength = $this->read_packet_length($socket);
     51  
     52                 if($packetlength < 10) {
     53                     return false;
     54                 }
     55  
     56                 socket_read($socket, 1);
     57  
     58                 $packetlength = $this->read_packet_length($socket);
     59  
     60                 $data = socket_read($socket, $packetlength, PHP_NORMAL_READ);
     61  
     62                 if(!$data) {
     63                     return false;
     64                 }
     65  
     66                 $data = json_decode($data);
     67  
     68                 $serverdata['version'] = $data->version->name;
     69                 $serverdata['protocol'] = $data->version->protocol;
     70                 $serverdata['players'] = $data->players->online;
     71                 $serverdata['maxplayers'] = $data->players->max;
     72  
     73                 $motd = $data->description;
     74                 $motd = preg_replace("/(§.)/", "",$motd);
     75                 $motd = preg_replace("/[^[:alnum:][:punct:] ]/", "", $motd);
     76  
     77                 $serverdata['motd'] = $motd;
     78                 $serverdata['motd_raw'] = $data->description;
     79                 $serverdata['favicon'] = $data->favicon;
     80                 $serverdata['ping'] = $ping;
     81  
     82             } else {
     83  
     84                 $start = microtime(true);
     85  
     86                 socket_send($socket, "xFEx01", 2, 0);
     87                 $length = socket_recv($socket, $data, 512, 0);
     88  
     89                 $ping = round((microtime(true)-$start)*1000);//calculate the high five duration
     90          
     91                 if($length < 4 || $data[0] != "xFF") {
     92                     return false;
     93                 }
     94  
     95                 $motd = "";
     96                 $motdraw = "";
     97  
     98                 //Evaluate the received data
     99                 if (substr((String)$data, 3, 5) == "x00xa7x00x31x00"){
    100  
    101                     $result = explode("x00", mb_convert_encoding(substr((String)$data, 15), 'UTF-8', 'UCS-2'));
    102                     $motd = $result[1];
    103                     $motdraw = $motd;
    104  
    105                 } else {
    106  
    107                     $result = explode('§', mb_convert_encoding(substr((String)$data, 3), 'UTF-8', 'UCS-2'));
    108                         foreach ($result as $key => $string) {
    109                             if($key != sizeof($result)-1 && $key != sizeof($result)-2 && $key != 0) {
    110                                 $motd .= '§'.$string;
    111                             }
    112                         }
    113                         $motdraw = $motd;
    114                     }
    115  
    116                     $motd = preg_replace("/(§.)/", "", $motd);
    117                     $motd = preg_replace("/[^[:alnum:][:punct:] ]/", "", $motd); //Remove all special characters from a string
    118  
    119                     $serverdata['version'] = $result[0];
    120                     $serverdata['players'] = $result[sizeof($result)-2];
    121                     $serverdata['maxplayers'] = $result[sizeof($result)-1];
    122                     $serverdata['motd'] = $motd;
    123                     $serverdata['motd_raw'] = $motdraw;
    124                     $serverdata['ping'] = $ping;
    125  
    126             }
    127  
    128             $this->disconnect($socket);
    129  
    130             return $serverdata;
    131  
    132         }
    133  
    134         private function connect($host, $port) {
    135             $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    136             socket_connect($socket, $host, $port);
    137             return $socket;
    138         }
    139  
    140         private function disconnect($socket) {
    141             if($socket != null) {
    142                 socket_close($socket);
    143             }
    144         }
    145  
    146         private function read_packet_length($socket) {
    147             $a = 0;
    148             $b = 0;
    149             while(true) {
    150                 $c = socket_read($socket, 1);
    151                 if(!$c) {
    152                     return 0;
    153                 }
    154                 $c = Ord($c);
    155                 $a |= ($c & 0x7F) << $b++ * 7;
    156                 if( $b > 5 ) {
    157                     return false;
    158                 }
    159                 if(($c & 0x80) != 128) {
    160                     break;
    161                 }
    162             }
    163             return $a;
    164         }
    165  
    166     }
    167 ?>

    很好,我们继续。

    再新建一个php文件,名字和上面一样随意。然后复制如下代码到里面。

     <?php
        include_once 'status.class.php';
        
        $status = new MinecraftServerStatus(); //
        $response = $status-> getStatus('s1.devicloud.cn', 25565); // 服务器地址
    
    if(!$response) {
        echo"服务器可能离线!";
    } else {
        echo"".$response['players']."";
    }
     
    ?> 

    好,就这样。

    其中include_once 'status.class.php';

    是上面引用PHP库的相对路径。

    如果那个PHP库在同级目录的libraries文件夹下,那就应该这样写:

    include_once '/libraries/status.class.php';

    然后就可以在你的网页内调用这段代码啦!

    调用:

    结果:

  • 相关阅读:
    C++11 指针成员与拷贝构造(浅拷贝与深拷贝)
    C++11 委派构造函数
    C++11 继承构造函数
    C++11 局部和匿名类型作模板实参
    C++11 外部模板
    C++11 函数模板的默认模板参数
    2D游戏新手引导点光源和类迷雾实现
    UVA 12293
    【算法】8 图文搭配诠释三种链表及其哨兵
    小米面试
  • 原文地址:https://www.cnblogs.com/Dinnerbone/p/12088133.html
Copyright © 2020-2023  润新知