现在的位置: 首页 > 综合 > 正文

PeerSim 代码初探和使用

2014年02月07日 ⁄ 综合 ⁄ 共 2448字 ⁄ 字号 评论关闭

       最近要帮朋友用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,呵呵。

抱歉!评论已关闭.