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

废话不多说,直接上图:

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

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

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

很好,让我们来搞吧!

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

名字可以起做STATUS.CLASS.php

然后里面加入如下代码:

  1 <?php
  2
  3     /**
  4     * Minecraft服务器状态查询
  5     * @作者 Julian Spravil <[email protected]> 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, "\x01\x00", 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, "\xFE\x01", 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) == "\x00\xa7\x00\x31\x00"){
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‘;

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

调用:

结果:

原文地址:https://www.cnblogs.com/Dinnerbone/p/12088133.html

时间: 2024-08-01 14:19:50

PHP下查询游戏《Minecraft》多人游戏 服务器的人数。的相关文章

游戏服务器之服务器优化思路

本文只是提供一些游戏服务器优化思路,其中一些思路是用在不同场合的,不是同个架构的.需要根据应用场景选用合适方式. 一.框架设计优化 1.分静态服务器和动态服务器. 2.动态服务器使用两层负载均衡:多网关  和 多场景.网关的选择是登陆服务器根据网关的负载来选择.场景则作为分线和副本等分开. 框架图参考:http://blog.csdn.net/chenjiayi_yun/article/details/18891591 3.中心服务器负责服务器依赖检查和内部消息转发和控制登录流程.中心服务器会主

【CSWS2014 Summer School】大数据下的游戏营销模式革新-邓大付

大数据下的游戏营销模式革新 邓大付博士腾讯专家工程师 Bio:毕业于华中科技大学,现任腾讯IEG运营部数据中心技术副总监,负责腾讯游戏的数据挖掘相关工作,包括有用户画像,推荐系统,基础算法研究等.主要感兴趣的领域包括有分布式计算平台系统架构,机器学习算法等. =================================================== 这个讲座时间比较短,内容也比较少,不过还是让我开拓了眼界,比如TX游戏数据的规模.游戏服务器的规模以及游戏中一些算法.模型的应用. ==

Linux下搭建简单的DHCP服务器

在RHEL6.5下搭建简单的DHCP服务器 实验目标 1.为192.168.10.0/24网段的客户机自动配置网络参数 用来给客户机自动分配地址的IP地址范围是:192.168.10.50-192.168.10.100.192.168.10.120-192.168.10.200 客户机的默认网关地址设为192.168.10.1 客户机所使用的DNS服务器设为202.106.0.20.8.8.8.8,默认域后缀是"tarena.com" 将默认租期设为2小时,最大租期设置为4小时 2.为

【技测】游戏上线前服务器压力测试应该怎么做

伴随手游上线推广,玩家爆发式增长,不少开发者都遇到过玩家冲爆服务器的情况,因此降低服务器崩溃的风险就显得非常重要.游戏上线前如果做了服务器压力测试帮助会很大.今天就来说说压力测试. 编写脚本机器人 为了在游戏上线前实际掌握服务器的承载能力,在游戏的开发流程末端都会引入压力测试.最普遍的一种测试方式是机器人模拟测试.通过脚本机器人在游戏中模拟一个玩家可能进行的操作,几千个机器人在服务器里面连续执行各种操作,测试各处功能的完整度. 脚本机器人是大部分CP在上线前的一个重要压测手段,因为这是低成本下最

Linux下快速搭建ntp时间同步服务器

背景: 服务器多了,时间是否一致以及是否准备就显得格外重要,虽然这个问题总是被忽略,但是统一时间是很有必要的,因为时间问题导致服务出现问题也是司空见惯,本文简单介绍一下ntp的快速搭建和使用. 1.  安装ntp yum -y install ntp(直接yum安装即可) 2.  修改ntp.conf的配置 1)vim /etc/ntp.conf ①   配置方法一:只允许192.168.100.0网段的客户机进行时间同步 在restrict default kod nomodify notra

DNS查询过程及DNS服务器简单搭建

1.描述DNS查询过程以及DNS服务器类别. DNS查询过程: 一次完整的查询请求经过的流程: Client--> hosts文件 --> DNS Local Cache --> DNS Server (recursion) --> 自己负责解析的域:直接查询数据库并返回答案: 不是自己负责解析域:ServerCache --> iteration(迭代) DNS服务器类别: 主-辅DNS服务器: 主DNS服务器:维护所负责解析的域数据库的那台服务器:读写操作均可进行: 从D

windows下VisualSVN Server搭建SVN服务器

一.安装VisualSVN Server服务端(windows版) VisualSVN Server的服务端下载地址如下,标准版免费,企业版收费,这里以标准版安装 http://www.visualsvn.com/server/download/ 安装使用FSFS文件系统方式,服务端口为443,web访问地址为: https://192.168.1.197/svn/whale/ 二.安装本地管理工具及使用 以标准标安装服务器端完成后,在本机上下载管理工具客户端a或b方案: a).下载Visual

广州游戏发布站服务器哪家好

在防御和应对DDoS攻击时,保持警惕是至关重要的.安全管理员必须了解针对互联网系统的最新攻击趋势.策略和流程.各种统计信息表明,百万级DDoS攻击的规模和频率将继续增长,所以要做好防御措施应对最坏的情况,比如客户服务器遇到的攻击.提前做好准备是缩小DDoS攻击范围和强化潜在攻击目标防御能力的一个重要步骤.    福建网泰信息科技有限公司,是全方位整合网络资源的专业IDC基础服务商,是拥有ISP资质的电信运行商!自主运营6星级机房,省电信骨干网络,近期机房整体升级后,出口带宽2T,机房总防御1T级

你还在找棋牌 大型游戏专用 高防服务器吗

棋牌 大型游戏专用 高防服务器可咨询QQ:2881375115 棋牌 大型游戏专用 高防服务器可咨询电话:17759186719 棋牌游戏的攻击很大这个是众所周知的,不仅有小组恶意攻击,更有同行恶意竞争 所以,一个棋牌游戏想开的好 做的大必须选用一台好的服务器. 棋牌高防服务器哪里的用着好用? 棋牌高防服务器哪里有,稳定高效的棋牌服务器哪里有,安全稳定. 棋牌高防服务器免备案,高速稳定. 棋牌游戏不同阶段需要的服务器的配置不同,要求的防御也是不一 配置齐全: 高防服务器首选台州棋牌高防双线,99