安装总结
1.
第一步参照:http://hyhx2008.github.io/peersimshi-yong-jiao-cheng-1-ru-men.html (内容有介绍cycle-based 和 event-based,有详细的讲解cycle-based的example。也有作者自己添加的,但是没有提到如何实现)
第一步运行后出错,如下
解决参照:http://blog.csdn.net/jo_say/article/details/6437385 运行成功 (该博客只是能成功配置及运行,没有其它拓展)
-cp后面需要注明classpath,例如:java -cp peersim-1.0.5.jar;jep-2.3.0.jar;djep-1.0.0.jar peersim.Simulator example/config-example1.txt
2.
第二步参照:http://m.blog.csdn.net/article/details?id=39318011 (也是只有搭建,后期没有拓展)
3.调试
首先,先载入配置文件
Simulator: loading configuration
ConfigProperties: File C:\Users\Administrator.YJVJ16GQQCQ4SCT\Desktop\peersim-1.0.5\example\config-example1.txt loaded.
main方法执行步骤:
(1)Simulator的main()方法加载配置并执行实验。 独立实验的数量由配置参数“simulation.experiments”给出。 在所有实验中,配置是相同的,只有随机种子在实验之间不重新初始化。
(2)加载配置目前通过使用构造函数ParsedProperties.ParsedProperties(String [])构造ParsedProperties的实例来完成。 参数args只是传递给这个类。 然后,此类用于初始化配置。
(3)加载配置后,通过调用适当的引擎运行实验,其标识如下:
· CDSimulator: if CDSimulator.isConfigurationCycleDriven() returns true
· EDSimulator: if EDSimulator.isConfigurationEventDriven() returns true
此列表表示检查这些备选方案的顺序。 也就是说,如果多个返回true,那么第一个将被取。 注意,这个类只检查这些线索,不检查配置是否一致或有效。
4.教程
找到中文教程:http://hyhx2008.github.io/peersimshi-yong-jiao-cheng-2-jie-xi-cycle-basedmo-shi-fang-zhen.html (是第一步中第一个链接。有图片,有示例。)
http://blog.csdn.net/qianfu111/article/details/7286021有几种P2P仿真平台对比。
项目结构:
ConfigProperties 用于处理配置文件的类。 通过处理文件,系统资源和命令行来扩展属性的功能。——>子类
ParsedProperties
ParsedProperties 扩展类配置属性与基本解析功能。
ConfigContainer 这个类是Configuration中使用的配置数据的容器; 看到类的更多信息。
源码分析
ConfigContainer:
|——maxdepth=100;
|——private Map<String, Integer> protocols; //存放{lnk=1, avg=0}
|——private Map<String, Integer> protocols; //存放{lnk=1, avg=0}
CommonState:
|
|——private static Node node; //存放current node
|父类
CDState:
|
|——
-------------------------------------------------------------------------------------------------------------------
Network:
|——public static Node prototype = tmp; //原型节点
|——static Node[] node = null; //存放了网络中所有节点
|——reset(); //两个Protocol中AverageFunction(此步什么也没做)和IdleProtocol()。 reset()中创建原型节点,克隆原型节点生成50000个new GeneralNode(),GeneralNode下包含IdleProtocol和AverageFunction两个协议。
GeneralNode:
|——index //在节点列表的内部表示中设置此节点的索引
|——protected Protocol[] protocol = null; //存放了protocol[]={"protocol.avg","protocol.lnk"} //IdleProtocol
IdleProtocol://是存储邻居节点链路的一个静态容器
|——protected Node[] neighbors; //Neighbors
|——
SingleValueHolder:
|——value; //通过本类中setValue()方法赋值。
|——setValue(double); // (i*step+min.double)赋值(i是Node(i))
|父类
AverageFunction-----implements------- CDProtocol
-------------------------------------------------------------------------------------------------------------------
CDSimulator
|——runInitializers(); //两个Control中WireKOut()和LinearDistribution()。 WireKOut时node[i]上的protocol[1]向邻居生出20条边,即构成图,在node[i]的IdleProtocol下包含Node[20]存放邻居节点。 LinearDistribution时可以得到AverageFunction的父类SingleValueHolder中的value通过setValue(i*step+min.double)赋值(i是Node(i))。
|——private static Control[] controls = new FullNextCycle(" "); //含有3个controls,前两个赋值,第三个默认[control.avgo AverageObserver(),control.shf Shuffle(),FullNextCycle()]
|——private static Scheduler[] ctrlSchedules = new Scheduler(" ");
|——loadControls(); //给controls[3]赋值,给ctrlSchedules[3]赋值。 controls[]是对 (AverageObserver, Shuffle,FullNextCycle)这三个实现类的初始化。 ctrSchedules[]为Scheduler();
|——
WireGraph:
|——pid = 1; //
|——
|父类
WireKOut://进行的是对静态覆盖网的布线,特别的,节点以度数k随机地与其它节点相连接。
|—— //
|——
VectControl:
|——Setter setter; //存放的是
|——Getter getter;
|父类
LinearDistribution:
|——
|——
Setter:
|——Method method=public void peersim.vector.SingleValueHolder.setValue(double);
|——
-------------------------------------------------------------------------------------------------------------------
Control:
|父类
FullNextCycle:
|——protected Scheduler[] protSchedules = new Scheduler(names[i]); //names[i] 有两个[protocol.avg,protocol.lnk],不过 观察Scheduler创建于names[i]并无关系。
|——
Scheduler:
|——
|——
CDSimulator:
控制台:
205行 stop = stop || controls[j].execute(); //执行controls中的[control.avgo AverageObserver(),control.shf Shuffle(),FullNextCycle()]的execute()
总结:
P2P网络是由节点组成的,节点是协议的容器。Node接口提供了对Node 节点所包含的协议的访问方法,并为节点提供了固定的ID。这是一个特定的协议,被设计用来在Cycle-based模型中运行,它只CDProtocol 定义了在每一个周期中要运行的操作。
一般都由协议来实现,这个接口为其它协议提供了访问邻居节点集合Linkable 的服务,节点间相同的linkable协议类的实例定义了一个覆盖网络。
实现了这个接口的类可以在仿真期间的某个时间点调度执行,这些类Control 一般用于观察或修改仿真过程。
整体流程:
1.
读取配置文件(通过命令行参数传递进来),然后仿真器初始化网络中的节点和节点中的协议,每个节点都拥有相同的协议栈。节点和协议的实例是通过克隆来创建的,只有一个原型是通过构造方法创建,其它的节点和协议都是从这个原型中克隆而来。基于这个原因,协议类中clone方法的实现是很重要的。
2.
初始化操作,设置每个协议的初始状态。初始化阶段是由Control对象控制运行的,仅在实验开始时运行一次。在配置文件中,初始化的组件可以由init前缀识别,在下面讨论的initializer对象也是controls,但为了标记其功能以区别于一般的Control对象,它被配置用来在初始阶段运行。
3.
在初始化完成后,Cycle-based引擎在每一个周期中调用所有组件(protocols和controls)一次,直到完成了指定的周期数,或者某个组件决定终止仿真为止。在PeerSim中每一个对象(controls和protocols)都被赋以一个Scheduler对象,它定义了什么时候本组件将会被执行。在默认情况下,所有对象都会在每个周期中运行。但我们也可以配置一个protocol或control只在某些特定的周期中运行,也可以在每一个周期中指定组件的执行顺序。
CDScheduler里含有静态代码块,构造方法
NetWorkInit里的构造方法
GeneralNode里含有Protocol[4]{"JabejaNode","Newscast","JabejaOverlay","Tman"},其中JabejaOverlay协议是通Network.node[i].getProtocol(2)即调用GeneralNode里面的protocol[2]即JabejaOverlay,JabejaOverlay里面存在ArrayList<Node> neighbours。--------GeneralNode->JabejaOverlay->neighbours[]。
Network:
|——static Node[] node = null; //存放了所有节点。
OverlayGraph:
|——它相当于一个工具类,可以通过该类的方法得到图的一些信息,如:
|——OverlayGraph.getNeighbours可以通过node[i]的protocol[2]协议即JabejaOverlay协议获取到图的邻居节点集合。
摘取:
在Peersim中首先要建立节点(节点模型),之后把节点连接起来(拓扑模型)
节点是由一个类实现的,当被实例化后,每个节点将拥有独立的内存空间和协议栈
节点由ID和INDEX两个量来标识,
其中ID是在节点初始化后不会发生变化的,所以在任何时候ID都可以唯一地标识一个节点,它可以被理解为代表了现实中节点的IP地址,
而INDEX则是和网络动态演进相关的一个标识,当仿真一轮结束后,执行“洗牌”(Shuffle)动作后,节点的INDEX可能会变化。
当在网络中查找某个节点时,总是按照INDEX遍历所有节点,以搜寻ID为某个特定值的节点。