PHP下查询游戏《Minecraft》多人游戏 服务器的人数。
废话不多说,直接上图:


作为一个优雅的Minecraft服务器,肯定需要官网的嗯。
很多服务器的官网都有显示当前服务器在线人数,延迟,每一个子服在线人数,甚至出了个流量图。
我们不搞花里胡哨的查询人数,直接用最简单的代码去完成一个简约的人数查询。
很好,让我们来搞吧!
首先我们需要引用一个外部PHP文件。
名字可以起做STATUS.CLASS.php
然后里面加入如下代码:
<?php
/**
* Minecraft服务器状态查询
* @作者 Julian Spravil <julian.spr@t-online.de> Git地址:https://github.com/FunnyItsElmo
* @本库免费使用,但不要删除作者和版权。 */
class MinecraftServerStatus {
private $timeout;
public function __construct($timeout = 2) {
$this->timeout = $timeout;
}
public function getStatus($host = '127.0.0.1', $version = '1.7.*' , $port = 25565) {
if (substr_count($host , '.') != 4) $host = gethostbyname($host);
$serverdata = array();
$serverdata['hostname'] = $host;
$serverdata['version'] = false;
$serverdata['protocol'] = false;
$serverdata['players'] = false;
$serverdata['maxplayers'] = false;
$serverdata['motd'] = false;
$serverdata['motd_raw'] = false;
$serverdata['favicon'] = false;
$serverdata['ping'] = false;
$socket = $this->connect($host, $port);
if(!$socket) {
return false;
}
if(preg_match('/1.7|1.8/',$version)) {
$start = microtime(true);
$handshake = pack('cccca*', hexdec(strlen($host)), 0, 0x04, strlen($host), $host).pack('nc', $port, 0x01);
socket_send($socket, $handshake, strlen($handshake), 0); //give the server a high five
socket_send($socket, "\x01\x00", 2, 0);
socket_read( $socket, 1 );
$ping = round((microtime(true)-$start)*1000); //calculate the high five duration
$packetlength = $this->read_packet_length($socket);
if($packetlength < 10) {
return false;
}
socket_read($socket, 1);
$packetlength = $this->read_packet_length($socket);
$data = socket_read($socket, $packetlength, PHP_NORMAL_READ);
if(!$data) {
return false;
}
$data = json_decode($data);
$serverdata['version'] = $data->version->name;
$serverdata['protocol'] = $data->version->protocol;
$serverdata['players'] = $data->players->online;
$serverdata['maxplayers'] = $data->players->max;
$motd = $data->description;
$motd = preg_replace("/(§.)/", "",$motd);
$motd = preg_replace("/[^[:alnum:][:punct:] ]/", "", $motd);
$serverdata['motd'] = $motd;
$serverdata['motd_raw'] = $data->description;
$serverdata['favicon'] = $data->favicon;
$serverdata['ping'] = $ping;
} else {
$start = microtime(true);
socket_send($socket, "\xFE\x01", 2, 0);
$length = socket_recv($socket, $data, 512, 0);
$ping = round((microtime(true)-$start)*1000);//calculate the high five duration
if($length < 4 || $data[0] != "\xFF") {
return false;
}
$motd = "";
$motdraw = "";
//Evaluate the received data
if (substr((String)$data, 3, 5) == "\x00\xa7\x00\x31\x00"){
$result = explode("\x00", mb_convert_encoding(substr((String)$data, 15), 'UTF-8', 'UCS-2'));
$motd = $result[1];
$motdraw = $motd;
} else {
$result = explode('§', mb_convert_encoding(substr((String)$data, 3), 'UTF-8', 'UCS-2'));
foreach ($result as $key => $string) {
if($key != sizeof($result)-1 && $key != sizeof($result)-2 && $key != 0) {
$motd .= '§'.$string;
}
}
$motdraw = $motd;
}
$motd = preg_replace("/(§.)/", "", $motd);
$motd = preg_replace("/[^[:alnum:][:punct:] ]/", "", $motd); //Remove all special characters from a string
$serverdata['version'] = $result[0];
$serverdata['players'] = $result[sizeof($result)-2];
$serverdata['maxplayers'] = $result[sizeof($result)-1];
$serverdata['motd'] = $motd;
$serverdata['motd_raw'] = $motdraw;
$serverdata['ping'] = $ping;
}
$this->disconnect($socket);
return $serverdata;
}
private function connect($host, $port) {
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $host, $port);
return $socket;
}
private function disconnect($socket) {
if($socket != null) {
socket_close($socket);
}
}
private function read_packet_length($socket) {
$a = 0;
$b = 0;
while(true) {
$c = socket_read($socket, 1);
if(!$c) {
return 0;
}
$c = Ord($c);
$a |= ($c & 0x7F) << $b++ * 7;
if( $b > 5 ) {
return false;
}
if(($c & 0x80) != 128) {
break;
}
}
return $a;
}
}
?>
很好,我们继续。
再新建一个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';
然后就可以在你的网页内调用这段代码啦!
调用:

结果:

PHP下查询游戏《Minecraft》多人游戏 服务器的人数。的更多相关文章
- ColyseusJS 轻量级多人游戏服务器开发框架 - 中文手册(下)
快速上手多人游戏服务器开发.后续会基于 Google Agones,更新相关 K8S 运维.大规模快速扩展专用游戏服务器的文章.拥抱️原生 Cloud-Native! 系列 ColyseusJS 轻量 ...
- ColyseusJS 轻量级多人游戏服务器开发框架 - 中文手册(系统保障篇)
快速上手多人游戏服务器开发.后续会基于 Google Agones,更新相关 K8S 运维.大规模快速扩展专用游戏服务器的文章.拥抱️原生 Cloud-Native! 系列 ColyseusJS 轻量 ...
- ColyseusJS 轻量级多人游戏服务器开发框架 - 中文手册(中)
快速上手多人游戏服务器开发.后续会基于 Google Agones,更新相关 K8S 运维.大规模快速扩展专用游戏服务器的文章.拥抱️原生 Cloud-Native! 系列 ColyseusJS 轻量 ...
- 【转】在sqlserver下增加MYSQL的链接服务器,实现分布式数据库开发第一步
首先要在SQLserver上服务器上这装ODBC对mysql的支持,我下载了mysql-connector-odbc-5.1.5-win32.rar,安装后在ODBC中有了DRIVER={MySQL ...
- oracle下查询的sql已经超出IIS响应时间
场景: 最近一直发生oracle下查询的sql已经超出IIS响应时间,但是后台DB的SQL查询还未终止,一直在查询.这对DB是造成很大的压力. 解决办法 增加OracleCommand 中的Comma ...
- linux下查询进程占用的内存方法总结
linux下查询进程占用的内存方法总结,假设现在有一个「php-cgi」的进程 ,进程id为「25282」.现在想要查询该进程占用的内存大小.linux命令行下有很多的工具进行查看,现总结常见的几种方 ...
- 【CSWS2014 Summer School】大数据下的游戏营销模式革新-邓大付
大数据下的游戏营销模式革新 邓大付博士腾讯专家工程师 Bio:毕业于华中科技大学,现任腾讯IEG运营部数据中心技术副总监,负责腾讯游戏的数据挖掘相关工作,包括有用户画像,推荐系统,基础算法研究等.主要 ...
- 来玩一局CS吗?UE4射击游戏的独立服务器构建
前言 根据UE4官方文档的介绍,UE4引擎在架构时就已经考虑到了多人游戏的情景,多人游戏基于客户端-服务器模式(CS模式).也就是说,会有一个服务器担当游戏状态的主控者,而连接的客户端将保持近似的 ...
- 探索使用 Golang 和 Webassembly 构建一个多人游戏服务器
什么是 WebAssembly?由 Google.Microsoft.Mozilla.Apple 等发起的 WebAssembly 是一种新的字节码格式,主流浏览器都已经支持 WebAssembly. ...
随机推荐
- 【转帖】刘备三顾茅庐,请Elasticsearch出山
刘备三顾茅庐,请Elasticsearch出山 2019-08-08 18:31 https://www.sohu.com/a/332454886_463994?spm=smpc.author.fd- ...
- Springmvc使用注解实现执行定时任务(定时器)
1.在Spring配置文件中添加 <task:annotation-driven/> 2.在需要调用执行定时任务的类中使用注解 @Service @Lazy(false) //避免spri ...
- Jboss: Using reverse path on top path: /xxx
环境 jboss 5.2 原因 加载资源的协议错误.一般在加载文件的时候,URL 都是以 file: 开头,但是在 jboss 上时,由于其虚拟化了路径,导致协议不一致,并且找不到外部的配置文件. 分 ...
- Win32汇编之其他指令
汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地 ...
- 《深入实践C++模板编程》之五——容器与迭代器
1.容器的定义 容器:专门用于某种形式组织及存储数据的类称为“容器”. 2.容器与迭代器 迭代器:封装了对容器虚拟数据序列的操作并按约定提供统一界面以遍历容器内容的代理类即为迭代器. 举例理解 ...
- 【原创】Linux基础之去掉windows中的\r
linux换行为\n,windows换行为\r\n,windows环境编辑的shell脚本在linux下执行会报错: line 2: $'\r': command not found 查看 # cat ...
- BZOJ2659算不出的算式不正经题解
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2659 分析 难得做到此类打表题目,不觉回想到NOIp2017考场上的SB经历 这道题看到 ...
- 谁是嫌疑犯问题Python枚举法
原文:https://blog.csdn.net/yunzifengqing/article/details/81941592 问题描述:有6名犯罪嫌疑人A.B.C.D.E.F,已知如下事实: A.B ...
- go之环境安装
1)Linux安装 https://studygolang.com/dl # 在 ~ 下创建 go 文件夹,并进入 go 文件夹 mkdir ~/go && cd ~/go 下载的 g ...
- MYSQL 创建数据库以及表
创建数据库,表 创建一个数据库,再在数据库下创建一个或多个表,不难,记不住的同学可以直接copy,慢慢的用会即刻,懂的同学请看代码,没有太多基础的同学,除了看代码,请看最下方的知识点 创建数据库: C ...