0

对,

我正在尝试用 PHP 编写一个小脚本,它将游戏中的聊天包发送到 Minecraft。

//Deliberately low timeout
$mc = fsockopen("localhost", 25565, $errno, $err, 3);

现在,如果连接成功,那么我发送 2 个“数据包”。

一个带有整数 3 的字节,告诉 Minecraft 它应该将传入的网络流量作为 Packet3Chat “数据包”处理:

fwrite( $mc, strrev( pack( "C", 3 )  ) );

这似乎可以正常工作**。

所需的第二个“数据包”是将字符串的长度作为有符号的 short

$my_string = "Hello World!";
//119 character limit on Minecraft chat messages
$processed_string = substr($my_string, 0, 119);
fwrite($mc, strrev( pack( "s", strlen( $processed_string ) ) ) );

这似乎也可以正常工作**。

现在剩下要做的就是发送实际的字符串,作为 chars

我尝试使用以下方法拆分字符串str_split并单独发送每个字符:

//Signed char
fwrite($mc, strrev( pack( "c", $character ) ) );

//Unsigned char
fwrite($mc, strrev( pack( "C", $character ) ) );

而且我还尝试通过这些方法仅发送整个字符串而不将其拆分,但是我无法成功打印出接收到的字符readChar()System.out.println仅打印一个空行),并且我收到fwrite 错误 10053 at在发送字符期间的某个时间点 - 即 anEOFExceptionreadChar().

我在 Windows 7 上运行修改后的 Minecraft Server,并在同一台机器上使用 XAMPP 运行 PHP 5.x。

任何想法为什么连接会“被软件关闭”?为什么它只会在发送字符/字符串期间而不是在发送字节/短字节期间关闭?


** 是的,我曾经用来System.out.println验证 Minecraft 收到的数据。

4

2 回答 2

4

10053 是WSAECONNABORTED的 winsock 错误代码。
可以在http://www.chilkatsoft.com/p/p_299.asp找到对该错误情况的“可理解”解释

于 2011-08-03T08:57:06.330 回答
0

尝试插件HTTPConsole

并使用这样的函数来执行命令:

function exec_shell_command($command) {
$command = urlencode($command);
$url = "http://127.0.0.1:25560/console?command=$command";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$out = curl_exec($ch);
curl_close($ch);
return $out;
}
$retval = exec_shell_command("say this is a server message");

当您说“发送聊天消息”时,我不确定这是否是您想要的,这会将控制台消息发布到服务器。

于 2011-08-16T10:53:06.333 回答