当前位置: 首页 > 面试题库 >

将DHT查询发送到“ router.bittorrent.com”响应乱码的文本

池宸
2023-03-14
问题内容

我在bep_0005页中阅读了DHT协议。

但是,当我发送ping查询或find_node查询时,服务器将响应乱码的文本( _router.bittorrent.com:6881_ 或
_dht.transmissionbt.com:6881_ )

这是下面的Java源代码

    public String ping(final String id) {
    System.out.println("Start ping:" + id);
    Bencode bencode = new Bencode();
    byte[] encoded = bencode.encode(new HashMap<Object, Object>() {
        private static final long serialVersionUID = 4225164001818744013L;

        {
            put("t", "tr");
            put("y", "q");
            put("q", "ping");
            put("a", new HashMap<Object, Object>() {
                private static final long serialVersionUID = -6092073963971093460L;

                {
                    put("id", id);
                }
            });
        }
    });
    byte[] result = client.send(new String(encoded, bencode.getCharset()));
    Map<String, Object> dict = bencode.decode(result, Type.DICTIONARY);
    System.out.println("Bdecoded Data:" + dict);
    return "";
}

发送数据

ping查询= {“ t”:“ aa”,“ y”:“ q”,“ q”:“ ping”,“ a”:{“ id”:“
abcdefghij0123456789”}}

bencoded = d1:ad2:id20:abcdefghij0123456789e1:q4:ping1:t2:aa1:y1:qe

添加到bep_0005协议的响应如下:

响应= {“ t”:“ aa”,“ y”:“ r”,“ r”:{“ id”:“ mnopqrstuvwxyz123456”}}

bencoded = d1:rd2:id20:mnopqrstuvwxyz123456e1:t2:aa1:y1:re

但是我的回答是:

响应= {ip = P ,r = {id =2 NisQ J } ͺ F | g},t = tr,y = r}

bencoded = d2:ip6: P 1:rd2:id20:2 NisQ J )ͺ F | ge1:t2:tr1:y1:re

发送udp部分的Java代码是:

    public byte[] send(String sendData) {
    DatagramSocket client;
    try {
        client = new DatagramSocket();
        client.setSoTimeout(5000);
        byte[] sendBuffer;
        sendBuffer = sendData.getBytes();
        InetAddress addr = InetAddress.getByName("router.bittorrent.com");
        int port = 6881;
        DatagramPacket sendPacket = new DatagramPacket(sendBuffer, sendBuffer.length, addr, port);
        client.send(sendPacket);
        byte[] receiveBuf = new byte[512];
        DatagramPacket receivePacket = new DatagramPacket(receiveBuf, receiveBuf.length);
        client.receive(receivePacket);
        System.out.println("Client Source Data:" + Arrays.toString(receivePacket.getData()));
        String receiveData = new String(receivePacket.getData(), "UTF-8");
        System.out.println("Client String Data:" + receiveData);
        client.close();
        return receivePacket.getData();
    } catch (SocketException e) {
        e.printStackTrace();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

读取UTF-8中的响应,但是iso-8859-1也是乱码。

谁能帮助我,谢谢!


问题答案:

服务器响应乱码

否,响应将被编码并包含原始二进制数据。
不能将其视为文本。

在BEP5中,为了使示例中的原始二进制node_id可打印,已明智地选择了它仅由字母数字字符组成。

ip键是一个扩展的解释:BEP42 - DHT安全扩展

收到的响应是完全有效的。

TODO: Working Java code


 类似资料:
  • 问题内容: 我在bep_0005页中阅读了DHT协议。 但是,当我发送ping查询或find_node查询时,服务器将响应乱码的文本( _router.bittorrent.com:6881_ 或 _dht.transmissionbt.com:6881_ ) 这是下面的Java源代码 发送数据包 ping查询= {“ t”:“ aa”,“ y”:“ q”,“ q”:“ ping”,“ a”:{“

  • 问题内容: 在我的Django应用程序中,我想跟踪响应是否已成功发送到客户端。我很清楚,HTTP之类的无连接协议中没有“防水”方式来确保客户端已接收(并显示)响应,因此这不是关键任务功能,但是我仍然想在最近的可能时间。响应将不是HTML,因此无法从客户端进行任何回调(使用Javascript或IMG标签等)。 我可以找到的“最新”钩子是在中间件列表的第一个位置添加实现process_respons

  • 问题内容: 我有一个PHP脚本,需要使用HTTP响应代码(状态代码)进行响应,例如HTTP 200 OK,或一些4XX或5XX代码。 如何在PHP中做到这一点? 问题答案: 我刚刚发现了这个问题,并认为它需要一个更全面的答案: 从 PHP 5.4开始 ,有三种方法可以实现此目的: 自行组装响应代码(PHP> = 4.0) 该函数有一个特殊的用例,可以检测HTTP响应行,并让您用自定义行替换它 但是

  • 问题内容: Expressjs框架具有sendfile()方法。我如何在不使用整个框架的情况下做到这一点。我正在使用node-native- zip创建档案,并将其发送给用户。 问题答案: 这是一个示例程序,它将通过从磁盘流式传输myfile.mp3来发送myfile.mp3(也就是说,在发送文件之前,它不会将整个文件读入内存)。服务器在端口2000上侦听。 [更新] 正如@Aftershock在

  • 在我的JSP页面中,我使用了以下ajax调用(valums-file-上传器)并且文件上传成功。JSF正确调用了适当的Servlet。我正在检查上传的文件并在Servlet中进行服务器端验证。我不确定如何将消息打印回同一个JSP的div。例如。如果一个字段为空,该文件将不会上传,但我还想同时显示一条自定义消息。到目前为止,我已经以String格式存储了消息。我有HttpServletACK对象,但

  • 我们有一份时事通讯,它使用媒体查询,以一种响应式的格式显示出来,适用于较小的屏幕。它在Outlook中按应显示的方式显示,但在转发电子邮件时,Outlook似乎正在删除媒体查询代码。我们正在使用Outlook发送电子邮件,因为我们需要包含exchange列表。有没有人知道Outlook在转发时删除媒体查询代码的方法,或者通过Outlook发送带有媒体查询的电子邮件的另一种方法?