86103155 2019-12-23
废话不多说,直接上图:
很多服务器的官网都有显示当前服务器在线人数,延迟,每一个子服在线人数,甚至出了个流量图。
我们不搞花里胡哨的查询人数,直接用最简单的代码去完成一个简约的人数查询。
很好,让我们来搞吧!
首先我们需要引用一个外部PHP文件。
名字可以起做STATUS.CLASS.php
然后里面加入如下代码:
<?php /** * Minecraft服务器状态查询 * @作者 Julian Spravil <> Git地址:https://github.com/FunnyItsElmo * @本库免费使用,但不要删除作者和版权。 8 */ 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‘;
然后就可以在你的网页内调用这段代码啦!