如何用java实现一个p2p种子搜索-dht协议实现
Posted mistletoe9527
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用java实现一个p2p种子搜索-dht协议实现相关的知识,希望对你有一定的参考价值。
dht协议实现
上一篇完成了路由表的实现,建立了路由表后,我们还要对路由表进行初始化,因为一开始路由表为空,所以我们需要借助一些知名的dht网络中的节点,对这些节点进行find_node,然后一步步初始化路由表。这里我们选dht.transmissionbt.com来进行初始化。在dht网络都是使用upd协议进行数据的传输,所以我们需要开启一个upd端口,这里使用netty来做通信框架。这里我们主要来看怎么发送find_node
/**
* find_node
* @param node 自己的id
* @param target 目标id
* @param address 请求地址
* @param num channel号
*/
public void findNode(String node,String target,InetSocketAddress address,int num){
if(!channels.get(num).isWritable()){
return;
}
FindNodeRequest findNodeRequest=new FindNodeRequest(node,target);
channels.get(num).writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer(bencode.encode(DHTUtil.beanToMap(findNodeRequest))), address));
}
FindNodeRequest 主要有哪些字段
@Data
@AllArgsConstructor()
public class BaseRequest {
private String t;//messageid 2 byte
private String y;//"q" for query, "r" for response, or "e" for error
private String q;//method ping/find_node/get_peers/announce_peer
//private String v;//client identifier registered in BEP 20 这里不管这个
}
public class FindNodeRequest extends BaseRequest{
private FindNodeRequestContent a=new FindNodeRequestContent();
@Data
@Accessors(chain = true)
private static class FindNodeRequestContent{
private String id;
private String target;
}
public FindNodeRequest(String id,String target){
super(DHTUtil.generateMessageId(),
MessageTypeEnmu.QUERY.getKey(),
MethodEnmu.FIND_NODE.getKey());
a.id=id;
a.target=target;
}
public static void main(String[] args) {
FindNodeRequest f=new FindNodeRequest("df","23");
}
}
以上是关于如何用java实现一个p2p种子搜索-dht协议实现的主要内容,如果未能解决你的问题,请参考以下文章
老司机程序员教你用Python获取种子,源源不绝的那种!营养跟不上