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. ...
随机推荐
- Linux Pycharm 添加图标到root账户桌面
1. 去官网下载pycharm程序 2. 解压缩下载到的tar包 3. 在/usr/share/applications目录下新建一个pycharm.desktop, 写入内容如下, 注意红色字体需要 ...
- 首篇-记录自己学习python之路!
对于自己学习python的目的比较明确——爬虫和量化. 目前找了一些资源进行学习,先进行量化方面的学习,爬虫滞后.目前的目标是“180天掌握尽可能多的量化能力”! 以后定时发送自己学习思考内容以作自己 ...
- Boot-crm管理系统开发教程(二)
ps:昨天将管理员登录的功能完成了,并完美的解决跳过登录从而进入管理界面的bug,今天我们将实现"查询用户"功能. ①在po包中创建Customer类,并编写相关变量和添加set/ ...
- Graph、DFS、BFS
Graph.java package Graph; import LinearLIst.bag.Bag; import edu.princeton.cs.algs4.In; public class ...
- 26-Perl 包和模块
1.Perl 包和模块Perl 中每个包有一个单独的符号表,定义语法为:package mypack;此语句定义一个名为 mypack 的包,在此后定义的所有变量和子程序的名字都存贮在该包关联的符号表 ...
- shiro过滤器机制
shiro内置过滤器介绍 https://blog.csdn.net/qq_35608780/article/details/71703197 Shiro的Filter机制详解---源码分析 http ...
- Ubuntu系统开机后不能正常使用——问题解决记录
1.开机后桌面内容没了,搜狗输入法不能使用了,终端不能打开了 问题原因:上次关机前为了解决解压文件中文乱码问题,在/etc/profile末尾加了如下两行:(但事实上如下两行根本不能解决中文乱码问题) ...
- C#文本_文件夹操作
1我们常用的File类 可以用来对文件的一些操作 下面看代码. using System;using System.Collections.Generic;using System.IO;using ...
- 【科创人·独家】连续创业者高春辉的这六年:高强度投入打造全球领先的IP数据库
您能看到:高春辉的创业观,IPIP.NET半程复盘及未来规划,连续创业的体验,小众产品趣事 您看不到:往年创业的回顾,技术干货,受制于篇幅忍痛割舍的精彩观点 文末彩蛋:<与雷军的分歧并非否定电商 ...
- 价值19.9元 <问药师 - 儿童维生素D的补充> 总结
1岁以上的婴幼儿(一直到18岁), 每天应该补充维生素D 400-800UI, 这其中应包含当天的晒太阳时间. 1岁以下400UI户外晒太阳时间, 夏季30分钟, 冬季2小时, 再根据实际情况加减每天 ...