php - PHP数据包到Minecraft服务器?

标签 php sockets network-protocols minecraft packets

数据包格式的来源: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/

相关文章:

php - php __set()、__get和简单设置、获取函数的区别

php - 将数组发送到 codeigniter 中的函数

java - 二进制和文本结构(数据包)的高效解码

PHP:如何获取引荐来源网址?

ios - AppDelegate中Viewcontroller的访问变量

java - 将 RCON 转换为 Java

c - 如何仅读取已更改的文件描述符

sockets - Linux 内核 IPv4 和 IPv6 套接字创建 : EPROTONOSUPPORT and ESOCKTNOSUPPORT errors

android - 为Android Webview启用TSL1.2

php - 如何使用 Symfony Serializer 反序列化复杂对象数组?