Java 从Bittorrent的DHT引导中获取加扰回复

Java 从Bittorrent的DHT引导中获取加扰回复,java,character-encoding,bittorrent,dht,Java,Character Encoding,Bittorrent,Dht,我正试图在Bittorrent主线中实现一个DHT节点。到目前为止,我获得了一个针对引导节点的进出连接,根据一些bencoded示例,查询似乎很好,但我得到的部分结果都是加扰的(包含实际数据的部分): 这是我目前的代码: private static String serverName = "router.utorrent.com"; private static int port = 6881; private static String packet = "d1:ad2:id20:abcde

我正试图在Bittorrent主线中实现一个DHT节点。到目前为止,我获得了一个针对引导节点的进出连接,根据一些bencoded示例,查询似乎很好,但我得到的部分结果都是加扰的(包含实际数据的部分):

这是我目前的代码:

private static String serverName = "router.utorrent.com";
private static int port = 6881;
private static String packet = "d1:ad2:id20:abcdefghij0123456789e1:q4:ping1:t2:aa1:y1:qe";
public static void main(String[] args)  {

    int port = Main.port;
    InetAddress address = InetAddress.getByName(Main.serverName);
    DatagramSocket socket = new DatagramSocket();

    byte[] buf = Main.packet.getBytes();
    DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
    socket.send(packet);
    byte[] recBuf = new byte[2048];
    DatagramPacket recPacket = new DatagramPacket(recBuf, recBuf.length);

    socket.receive(recPacket);

    System.out.println(new String(extract(recPacket)));
}

  private static byte[] extract(DatagramPacket packet) {
        byte[] data = packet.getData();
        int offset = packet.getOffset();
        int length = packet.getLength();

        byte[] copy = new byte[length];
        System.arraycopy(data, offset, copy, 0, copy.length);

        return copy;
      }

我不确定是否存在图表集问题,或者是否存在无法在任何地方找到的指定编码。

您的回答在我看来是正确的。听起来好像您希望DHT协议只使用ascii字符,但事实并非如此。160位节点ID传输为20字节,IP和端口传输为6字节


请参阅。

因为您是用java编写的,所以我自己的实现可能会引起您的兴趣:是的,而且它似乎比我的更先进。谢谢它在我运行的redis实例上非常有效。其次,我还考虑通过DHT主动搜索承载特定InfoHash的节点。我想这应该比你所做的更容易。可能有参考资料吗?我还没有CLI或其他类型的UI,但基本上你只需要发布一个,然后提供各种方法来获取刮取或对等列表结果。我想你可以通过github提问。
private static String serverName = "router.utorrent.com";
private static int port = 6881;
private static String packet = "d1:ad2:id20:abcdefghij0123456789e1:q4:ping1:t2:aa1:y1:qe";
public static void main(String[] args)  {

    int port = Main.port;
    InetAddress address = InetAddress.getByName(Main.serverName);
    DatagramSocket socket = new DatagramSocket();

    byte[] buf = Main.packet.getBytes();
    DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
    socket.send(packet);
    byte[] recBuf = new byte[2048];
    DatagramPacket recPacket = new DatagramPacket(recBuf, recBuf.length);

    socket.receive(recPacket);

    System.out.println(new String(extract(recPacket)));
}

  private static byte[] extract(DatagramPacket packet) {
        byte[] data = packet.getData();
        int offset = packet.getOffset();
        int length = packet.getLength();

        byte[] copy = new byte[length];
        System.arraycopy(data, offset, copy, 0, copy.length);

        return copy;
      }