当前位置: 首页 > 知识库问答 >
问题:

PHP数据包到minecraft服务器?

管峻
2023-03-14

数据包格式的来源:http://wiki.vg/Protocol

我正试图用php编写一个程序,将数据包发送到我托管的minecraft服务器。这可能适用于不支持相同API格式的手机的多人游戏实现。我下面的代码是我失败的尝试。我怎样才能正确地做到这一点?服务器正在识别某些内容,但它要么没有发送任何内容,要么是其他内容。下面应该发送0x00,即握手数据包,以使用下一个状态ID:1请求服务器上的统计信息。Minecraft应该使用相同的ID进行响应,但是使用服务器motd和玩家计数。对于1.7.2,它也会发送一个服务器图标。巴布亚新几内亚。但我可以放心地忽略这些数据,因为它们只是直接连接。

我做错了什么?我该如何修复它?

主要的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);
?>

插座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# 

共有2个答案

祁聪
2023-03-14

两位评论者都是对的,你需要重新审视你是如何做到这一点的。

更具体地说,Minecraft协议使用UDP,这意味着您需要使用socket\u create-http://php.net/manual/en/function.socket-create.php

然后需要构建一个字符串,它正确地包含所有必需的数据包,如@Marc B所述。然后可以将该字符串写入套接字。请注意,由于UDP是无状态的,并且没有错误纠正功能,如果返回错误,还必须编写重试例程。

您目前正在做的是用一种语言(PHP)构建数据结构,然后尝试将它们写入有线协议(完全不同),这几乎是不可能的。

在PHP中当然可以做到这一点,但是您必须在比现在低得多的级别上工作,使用原始套接字、十六进制数据字符串和网络错误处理。我建议您查看处理UDP数据的其他PHP库,看看是否有一些代码可以重用。

socket\u create页面注释中有一些代码,您可以使用/学习这些代码。特别是,有一个TFTP示例,您可以对其进行修改

这不是一个简单的答案,但这在任何语言中都是非常重要的,PHP并不是为此而设计的,所以没有太多的例子。

辛成周
2023-03-14

你可能想看看这个:https://forums.bukkit.org/threads/web-php-simple-to-use-minecraft-server-status-query.144329/

这基本上是对这个库的一些解释,它正是你想要的:https://github.com/FunnyItsElmo/PHP-Minecraft-Server-Status-Query

它还使用套接字,因此您可以随时获取一些代码,并根据需要对其进行修改,但我强烈建议您按原样使用该库,因为它可以完成您试图完成的任务。

 类似资料:
  • 问题内容: 我一直在研究一个Java程序,该程序基本上类似于Minechat(基于文本的应用程序,仅用于查看聊天。)我从来没有真正与网络打交道,因此,问题在于弄清楚如何正确发送数据包。我目前处于与服务器创建握手的位置。经过数小时的研究,我提出了以下代码,但始终会遇到“ Failed!(Exception)”消息。对我来说,一切看起来都是正确的,但就我所知,这可能是100%错误的。如果有人可以指出我

  • 我一直在开发一个java程序,基本上类似于Minechat(基于文本的应用程序,用于查看聊天。)我从来没有在网络方面做过太多工作,所以问题是如何正确发送数据包。我目前正在创建与服务器的握手。经过几个小时的研究,我终于想出了以下代码,但它总是会出现“失败!(异常)”的消息。对我来说,一切看起来都是正确的,但据我所知,它可能是100%错误的。如果有人能指出我做错了什么,我会非常感激。 作为参考,请随意

  • 我正在使用C#开发简单的minecraft启动器。我想自动连接用户到我们的服务器使用IP地址和端口时,用户开始我的世界。

  • 我有一个服务器正在,我正在尝试将数据从嵌入式设备发送到节点服务器。Wireshark正在显示收到的数据包 wireshark收到的数据包的图像 的标头校验和设置为。我想不出原因是什么。

  • 这是我的服务器端解码器 这些是我的客户端->服务器数据包

  • 问题内容: 我正在学习PHP MYSQL并尝试创建数据库。 我正在关注本教程 http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql- web-service-for-an-ios-app 到目前为止,我正在测试服务器是否可以访问MySQL。当我使用以下代码时。 我收到以下错误: 我也许忘记了启用某些功能吗? 它可以解释为什