OpenKad简介
OpenKad项目是一个kademlia算法的JAVA实现。
其主页地址为:http://code.google.com/p/openkad/
关于kademlia算法请看维基百科:http://zh.wikipedia.org/wiki/Kademlia
kademlia算法原文:Kademlia A peer-to-peer_information_system_based_on_the_xor_metric
在eclipse编译Openkad
- 下载源码
- 下载源码
- 下载本工程源码:http://code.google.com/p/openkad/
- 下载依赖库:
- GUICE:http://code.google.com/p/google-guice/(guice-3.0.jar)
- AOPAlliance:http://aopalliance.sourceforge.net/(aopalliance-1.0.jar)
- GoogleGson:http://code.google.com/p/google-gson/(gson-2.1.jar)
- Lambdaj:http://code.google.com/p/lambdaj/(lambdaj-2.4-with-dependecies.jar)
- Apache-codec:http://commons.apache.org/codec/(commons-codec-1.6.jar)
- Mockito:http://code.google.com/p/mockito/(mockito-all-1.9.0.jar)
- JAVAEE:javax.inject.jar
- 测试程序依赖库:JUnit:http://junit.sourceforge.net/(junit-4.10.jar)
- 导入eclpise
- 打开eclipse,New->Other->SVN->从SVN项目检出,URL:http://openkad.googlecode.com/svn/trunk/openkad
- 右键test文件夹,build path->use as a source folder
- 下载上述链接库,并放入工程文件夹下,在Eclipse右侧资源栏找到,并右键->Build Path->add to build path.
- 打开test资源文件夹,打开il.technion.ewolf.kbr包,右键KeyBaseRoutingTest.java选择Run as->JUnit Test.
部分代码分析
package il.technion.ewolf.kbr
- Interface
KeyBaseRouting.java
定义了所有Kad网络中可进行的操作。
MessageHandler.java
为KeybasedRouting提供了通知对象,当此节点收到远方节点中sendmessage 发来的对象时,本节点调用过register方法后的messagehandler类会得到通知,和远方发来的对象。(观察者模式)
- Class
Key.java
用于标识节点ID,用KeyFactory生成本类对象
KeyGenerater.java
是测试生成key用的类
keyComparator.java
XOR metric比较方法实现类
KeyColorComparator.java
前者的派生类,用指定颜色比较KEY
RandomKeyFactory.java
(工厂模式) 调用了系统提供的MessageDigest类,输入生成算法名的字符串,位数,或者可以随机生成KEY
Node.java
Kad网络中的节点类,
Package il.technion.ewolf.kbr.openkad
- Interface
Bucket.java
Kad网络中“桶”的接口,含有三个基本操作。向桶内添加Node,把所有桶内元素加入到制定的容器中,标记节点失效。
- Class
SlackBucket.java
松弛桶:是bucket桶接口的一种实现。加入节点的策略是:
1. 当桶未满时,把新节点插入到桶的最后
2. 当桶满时,删除最老的节点,把新节点插入到最后。
StableBucket.java
稳定桶::是bucket桶接口的一种实现。节点的加入策略是:
(Kad经典算法)
- 如果该节点已经在桶,将其移动到最后
- 如果节点是不是在桶和桶是不充分的,将它移动到桶中的最后
- 如果节点是不是在桶桶是满的,平安桶中的第一个节点。
- 如果它返回的ping,移动它是第一个在水桶和不插入给定的节点
- 如果它不返回的ping,从桶中取出,并插入最后给定的节点
KBuckets.java
Kad算法中的k-桶实现类
KadNet.java
一个KeyBaseRouting接口的实现类
Package il.technion.ewolf.kbr.openkad.msg
这个包下定义了所有在kad网络中传送的消息对象类。
KadMessage.java
这个抽象类定义了所有在kad中传递消息所有类的父类。
KadRequest.java
这个抽象类继承于KadMessage.java,为所有消息请求的父类。
KadResponse.java
这个抽象类继承于KadMessage.java,为所有消息回复的父类。
StoreMessage.java
这个类定义了kad中RPC的STORE操作所应传递的消息类。
PingRequest.java
这个类定义了kad四种RPC操作中的PING操作消息。
PingResponse.java
这个类定义了kad四种RPC操作中的PING操作回复消息。
FindNodeRequest.java
这个类定义了FIND_NODE操作应传递的对象
FindNodeResponse.java
这个类定义了FIND_NODE接收操作者应该回复的对象。