数据包格式的来源:http://wiki.vg/Protocol
我正在尝试用php编写一个程序,该程序会将数据包发送到我托管的Minecraft服务器。这可能是针对不支持相同API格式的手机的多人游戏实现。我下面的代码是我使这项工作失败的尝试。我怎样才能正确地做到这一点?服务器正在识别某些东西,但是它没有发回任何东西或其他东西。下面的代码应该发送0x00,即握手数据包,以使用下一个状态ID请求服务器上的统计信息:1. Minecraft应该以相同的ID进行响应,但服务器motd和玩家计数。对于1.7.2,它将发送一个server-icon.png。但是我可以放心地忽略该数据,因为它仅是直接连接。
我在做什么错,该如何解决?
Main.php
require("socket.php");
$f = getStat("zontreck.dyndns.biz",25565);
/*$za = 0x00;
$za[0] = 74;
$za[1] = "zontreck.dyndns.biz";
$za[2] = 25565;
$za[3] = 1;
*/
$za = array(0x00,"Protocol Version"=>73,
"Server Address"=>"zontreck.dyndns.biz",
"Server Port"=>25565,
"Next State"=>1);
$dd = doWrite(pack("a",$za),$f);
echo("Response from doWrite: " .$dd."\n");
echo("Sending: " . pack("a",$za)."\n");
/*if(doWrite(pack("a",$za),$f))
{
echo(fgets($f));
} else {
echo(fgets($f));
}*/
$ff = fgets($f);
//$u = unpack("a",$ff);
fclose($f);
echo("Data from server: " . $ff."\n");
echo("Data from server length: " . strlen($ff)."\n");
//fclose($f);
?>
socket.php
<?
function getStat($url = "",$port=25565)
{
$f = fsockopen($url,$port);
return $f;
}
function doWrite($packet,$socket)
{
return fwrite($socket,$packet);
}
?>
来自main.php的输出
root@zontreck:/var/www/slmc# php main.php
PHP Notice: Array to string conversion in /var/www/slmc/main.php on line 16
Response from doWrite: 1
PHP Notice: Array to string conversion in /var/www/slmc/main.php on line 18
Sending: A
Data from server:
Data from server length: 0
root@zontreck:/var/www/slmc#
最佳答案
您可能需要看一下以下内容:
https://forums.bukkit.org/threads/web-php-simple-to-use-minecraft-server-status-query.144329/
这基本上是对该库的一些解释,它确实可以满足您的要求:
https://github.com/FunnyItsElmo/PHP-Minecraft-Server-Status-Query
它还使用套接字,因此您始终可以获取一些代码并根据需要对其进行修改,但是我强烈建议您按原样使用该库,因为它可以完成您要完成的工作。
关于php - PHP数据包到Minecraft服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20833409/