理论知识看完了,那就动手吧!
要想加入DHT网络,我们需要“介绍人” 带我们进去,就是初始节点,常用的初始节点有:
router.bittorrent.com:6881
router.utorrent.com:6881
还有两个我这边连不上就不提供了
消息交互用findnode来做示例:
然后对其发送find_node请求来获取其他节点
/**
* 对指定节点发送find_node请求
*
* @param node
*/
public void findNode(Node node) {
if (!node.check()) {
//node检查不通过
return;
}
//构建find_node消息体
FindNodeRequest findNodeRequest = new FindNodeRequest();
findNodeRequest.setId(localNode.getNodeId());
findNodeRequest.setTarget(GenerateUtils.generateNodeId());
RequestMessage<FindNodeRequest> findNodeMessage = new RequestMessage<FindNodeRequest>(findNodeRequest);
ThreadPool.findNodeSend.execute(new Runnable() {
@Override
public void run() {
//Bencode要发送的数据
byte[] data = bencode.encode(findNodeMessage);
//System.out.println(new String(data, Charset.forName("ISO-8859-1")));
try {
Thread.sleep(20);
//将消息放入发送列表中
sendTable.put(findNodeMessage.getT(), findNodeMessage.getQ());
datagramSocket.send(
new DatagramPacket(data, data.length, InetAddress.getByName(node.getIp()), node.getPort()));
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}

本文将从理论知识转向实践,通过介绍如何加入DHT网络并使用find_node请求作为示例,展示如何建立一个DHT爬虫。我们将利用router.bittorrent.com和router.utorrent.com作为初始节点,发送find_node请求,接收回复并解析消息,实现DHT网络的基本交互。
最低0.47元/天 解锁文章
8380

被折叠的 条评论
为什么被折叠?



