gpt4 book ai didi

java - 将 RCON 转换为 Java

转载 作者:行者123 更新时间:2023-11-30 15:29:41 24 4
gpt4 key购买 nike

我正在致力于为 Minecraft 实现 RCON,它使用 Valve rcon 协议(protocol),并且我已经掌握了 C 源代码并尝试将其实现到 Java 中,这就是我到目前为止所做的:

创建数据包: http://pastebin.com/9AeiSQPD

收到数据包:http://pastebin.com/n6V1KnPa

发送数据包:http://pastebin.com/rixhD15p

我正在向服务器发送 AUTH 数据包并尝试接收响应,但返回值为空,同时尝试发送命令抛出:

Software caused connection abort: socket write error

我做错了什么?

最佳答案

我认为您的代码中有两处错误。

1) 首先,如您所见 here数据包结构使用4字节 block (32位)little-endian整数。这意味着反向 block (参见here)。

2)其次,您没有在数据包末尾使用空 block (空字符串或空字符)。

解决方案:

1)使用:(ByteBuffer和ByteOrder来自原生java.nio java7)

writer.write(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN)
.putInt(p.size).array());
writer.write(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN)
.putInt(p.id).array());
writer.write(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN)
.putInt(p.cmd).array());

而不是:

writer.writeInt(p.size);
writer.writeInt(p.id);
writer.writeInt(p.cmd);

和:

ByteBuffer.wrap(<4_BLOCKS_BYTES>)
.order(ByteOrder.LITTLE_ENDIAN).getInt();

而不是:

reader.readInt();

哪里<4_BLOCKS_BYTES>是一个大小为 4 的字节数组,从读取器读取。

如果我可以给你一个建议,(我认为)使用全局缓冲区发送会更容易。我的意思是一个包含大小、id、类型、数据和空 block 作为字节的缓冲区。当您阅读响应时,同样的事情:使用缓冲区来读取 DataInputStreamavailable()然后解析它。

祝你好运!

Java 文档链接:java.nio:docs.oracle.com/javase/7/docs/api/java/nio/package-frame.htmlDataInputStream.available():docs.oracle.com/javase/7/docs/api/java/io/FilterInputStream.html#available()

关于java - 将 RCON 转换为 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26116219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com