将RCON转换为Java

时间:2014-09-30 08:31:45

标签: java c sockets remote-access

我正在使用Valve rcon协议实现RCON for Minecraft,我已经掌握了C源并尝试将其实现为Java,这就是我所做的事情。到目前为止已经完成了:

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

收到包裹:http://pastebin.com/n6V1KnPa

发送信息包:http://pastebin.com/rixhD15p

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

  

软件导致连接中止:套接字写入错误

我做错了什么?

1 个答案:

答案 0 :(得分:1)

我认为您的代码中存在两个错误的内容。

1)首先,您可以看到here数据包结构使用小端整数的 4字节块(32位)。手段反向阻止(见here)。

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

解决方案:

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,类型,数据和空块的缓冲区作为字节。当您阅读回复时也是如此:在DataInputStreamavailable()时使用缓冲区进行读取,然后解析它。

祝你好运!

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