我正在使用Valve rcon协议实现RCON for Minecraft,我已经掌握了C源并尝试将其实现为Java,这就是我所做的事情。到目前为止已经完成了:
创建数据包: http://pastebin.com/9AeiSQPD
收到包裹:http://pastebin.com/n6V1KnPa
发送信息包:http://pastebin.com/rixhD15p
我将AUTH数据包发送到服务器并尝试接收响应,但返回值为null,同时尝试发送命令抛出:
软件导致连接中止:套接字写入错误
我做错了什么?
答案 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,类型,数据和空块的缓冲区作为字节。当您阅读回复时也是如此:在DataInputStream
为available()
时使用缓冲区进行读取,然后解析它。
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()