dht java_java 构建磁力链接索引:Bencode 关于DHT的编码

本文介绍了Bencode,它是DHT(分布式哈希表)的标准编码格式,常用于磁力链接。Bencode主要用于构建磁力链接索引,以查询相关资源。文章通过实例展示了Bencode的编码规则,包括基础包和find_node包的构成,并提供了编码和解码的基本步骤。
摘要由CSDN通过智能技术生成

前言bencode 是 dht 的标准编码格式,DHT如果你没听说过,那磁力链接总得听说过吧,磁力链接就是基于DHT发展起来

想要自己建立磁力建立一套磁力链接索引,用来查询相关的资源,那么Bencode是必不可少的,也是建立链接的基础

源码

1.基础包 包含的信息,你没看错,协议规定的就是这么简单

private String t; //字符串类型 应当2个字节 通常放aa就可以了 t=aa private String y; //消息的类型,1个字节 q 请求 r 回复 e 错误 private String q; //方法名 ping find_node get_peers announce_peer private String a; //非基础包的叠加信息

2.find_node包 包含的信息 ,在基础包的基础上添加了 id和target,表示自己节点编号-目标节点编号 以键值对的形式放入a字段里面

private String id;

private String target;

3.将信息以键值对的方式显示出来,上面一行是为编码的数据,下面一行是经过编码的数据find_node Query = {"t":"aa", "y":"q", "q":"find_node", "a": {"id":"abcdefghij0123456789", "target":"mnopqrstuvwxyz123456"}}

bencoded = d1:ad2:id20:abcdefghij01234567896:target20:mnopqrstuvwxyz123456e1:q9:find_node1:t2:aa1:y1:qe

解析将上面的类 变成键值对的形式(其实这个没啥用,看看而已,重要的是下面这个)大家都懂,那么转化为bencode解码的格式其实差不多。

1.首先基础规则描述一下,对于键值对{}两个括号,用d和e代替

2.字符串 “t":"aa" 的表示 1:t2:aa (意思是 [key字段长度]:[key字段][value字段长度]:[value字段])

3.优先从a开始,然后是q,t,y不要问我为什么,我也不清楚,官网的例子都是这样

find_node编码

这是节点发现的编码

StringBuilder sb = new StringBuilder();

sb.append("d");

sb.append("1:a");

sb.append("d");

sb.append("2:id").append(id.length()+":"+id);

sb.append("6:target").append(target.length()+":"+target);

sb.append("e");

sb.append("1:q").append(getQ().length()+":"+getQ());

sb.append("1:t").append(getT().length()+":"+getT());

sb.append("1:y").append(getY().length()+":"+getY());

sb.append("e");

其他包的编码解码,有空的时候在写吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值