最近要帮朋友用peersim做毕设,看了几天,下面说下对peerSim的理解吧,呵呵,不一定全对,但是也有一定的参考价值吧,哈哈(主要是发现网上相关资料太少了,唉)。
首先不得不说peerSim写的很不错,可以用配置文件自动去配置网络属性,使用的协议,控制协议等,只要有相对应的类,并且在配置文件中关联上就行了,呵呵。
主要配置有三种:protocol,init,control.
Protocol是协议,init是在初始化时需要做的事件,control则是对整个网络的控制。可以在最后统计数据用,也可以每隔N时间对网络做一些变动,比如干扰等。
以下是我用到的一部分配置文件(因为整个项目是用peerSim模拟,所以必须是从Simulator启动,并且后面跟上参数,参数即是配置文件的名字):
simulation.logtime 10^6
simulation.experiments 1
network.size 3000
protocol.tr UniformRandomTransport
{
mindelay 0
maxdelay 0
}
protocol.my ChordProtocol
{
transport tr
}
control.requestgenerator requestGenerator
{
protocol my
step 100000
}
init.create CreateNw
{
protocol my
protocolClient edge
idLength 128
succListSize 12
}
control.oberver1 TestObserver
{
protocol my
protocolClient edge
step 990000
}
简单解释:
模拟总时长为 10^6 (注意这里的单位不是秒,具体不明,而且这是总时间还是间隔时间也不是很明白,呵呵),其后面参数中的step意思是每隔step便执行一次。如果step多于总时间的一半,即是只执行一次,可放在最后做对网络的统计。
Protocol.tr UniformRandomTransport
tr是别名,具体则是UniformRandomTransport这个类,当然这个类是我们写的喽。而且下面用到这个类只用写别名就可以了,下同
control.requestgenerator requestGenerator
这个类是我们网络中的请求类,都差不多,呵呵
好了不多说了,都差不多,慢慢看吧,配置文件就先说到这里。
下面就是说说peerSim吧,peerSim有两种模拟方式,一个是EDSIM,基于事件的模拟,另外一个是CDSIM,即是基于轮循的。我用的是EDSIM,即是基于事件的,在这种模拟中,所有的消息和操作都被记录为一个事件,放在一个名字为Heap的队列中,代码在peersim.edsim.EDSimulator.java中。
关键在peersim.edsim.EDSimulator.java 的nextExperiment函数中。
核心代码:
while (!exit) {
//System.out.println(exit);
exit = executeNext();
}
这里就是循环执行的关键,具体的操作就在executeNext()中啦,呵呵。
PeerSim中的Node(结点),Protocol(协议),Control(控制)都可以重写,Node只是个接口,我们可以实现它,但是PeerSim已经实现了它,在peersim.core.GeneralNode中。并且在代码peersim.core.network中有如下代码:
Node tmp = null;
if (!Configuration.contains(PAR_NODE))
{
System.err.println(
"Network: no node defined, using GeneralNode");
tmp = new GeneralNode("");
}
else
{
tmp = (Node) Configuration.getInstance(PAR_NODE);
}
代码意思为:如果配置文件中没有定义结果用哪个类,就用默认的generalNode类来生成结点,如果有定义,就使用定义的结点类来生成。
如果重写Node类,必须实现peersim.core.Node接口。
如果写protocol类,必须实现peersim.edsim. EDProtocol接口(我们是EDSIM实验,如果不是要实现peersim.cdsim.CDProtocol),这两个接口都继承了peersim.core..Protocol类,呵呵。而里面主要就是实现一个函数:processEvent就可以了,呵呵。
如果写Control类,必须实现peersim.edsim. Control接口。
一个结点可以有多种协议,可以用getProtocol(index)来获得,如果想给结点(generolNode)添加新属性,而这个属性是随机生成的。一定要记得在init(初始化协议)中对其每个都随机,而不要在GenerolNode中的初始化中随机生成,因为PeerSim中结点的生成都是基于Clone的,即是先生成一个,之后所有的都是第一个结点的Clone,呵呵,这个问题我也调了不少时间,呵呵。
好了,就写到这吧,这还是我有生以来第一篇自己写的技术文章呢,主要是网上相关资料太少了,况且马上就毕业了,也算一个记念吧,衷心的希望我的兄弟姐妹和朋友们都有一个好的归宿和好的未来,哪怕不行,也要平平安安啊,再见了朋友,再见了南邮。88,呵呵。