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. ...
随机推荐
- 某某网站PHP
在网站域名后输入:e/tool/gbook/?bid=1并回车,这样就打开了“帝国”CMS的留言功能.触发漏洞的步骤为: Step1.在“姓名”处输入:縗 Step2.在“联系邮箱”处输入:,1,1, ...
- (模板)hdoj5977 Garden of Eden(点分治)
题目链接:https://vjudge.net/problem/HDU-5977 题意:给一颗树,每个结点上有一个权值a[i],a[i]<=10,求有多少条路径满足这条路径上所有权值的结点都出现 ...
- Kudu建表语句
--建表CREATE TABLE kudu_testdb.perf_test_t1( id string ENCODING PLAIN_ENCODING COMPRESSION SNAPPY, int ...
- idea的配置文件------application.properties和application.yml
当application.yml 和 application.properties 两个文件同时存在的时候,application.properties的优先级是高于application.yml的, ...
- Linux系列(11):之bash进阶与数据流导向、管线命令
1.万用字符与特殊字符 在bash的环境下有一个特别有用的功能,那就是万用字符!下面展示常见的万用字符: 1.万用字符 除了万用字符还有一些其他的特殊字符,接下来显示特殊字符. 2.特殊字符 2.数据 ...
- TCP的组包、半包、粘包与分包
一.概念 1)组包.简单的说就是tcp协议把过大的数据包分成了几个小的包传输,接收方要把同一组的数据包重新组合成一个完整的数据包. 2)半包.指接受方没有接受到一个完整的包,只接受了部分,这种情况主要 ...
- linux下对服务器性能监控shell脚本
#!/bin/bash #提取本服务器的IP地址信息 ENO1=`ifconfig | sed -n '1,1p' | awk -F ' ' '{print $1}'` IP=` -d -d &quo ...
- Thrift Oneway是什么?
网上很多文章,都有各种涉及使用 oneway 的,基本是一个THRIFT IDL示例接口前面加 oneway.看完之后对 oneway的理解还是很模糊,于是看了下Thrift的代码,终于搞懂了 one ...
- 拨开Python迷雾
Python方向及能力要求 web就业方向:Python基础.Python高级.前端开发. web开发爬虫方向:Python基础.Python高级.前端开发.web开发. 爬虫开发数据挖掘/分析方 ...
- 【Havel 定理】Degree Sequence of Graph G
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=2454 [别人博客粘贴过来的] 博客地址:https://www.cnblogs.com/debug ...