peersim配置记录及调试cycle模式自带example的笔记

安装总结

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 ShuffleFullNextCycle)这三个实现类的初始化。  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中首先要建立节点(节点模型),之后把节点连接起来(拓扑模型)

节点是由一个类实现的,当被实例化后,每个节点将拥有独立的内存空间和协议栈

节点由IDINDEX两个量来标识,

其中ID是在节点初始化后不会发生变化的,所以在任何时候ID都可以唯一地标识一个节点,它可以被理解为代表了现实中节点的IP地址,

INDEX则是和网络动态演进相关的一个标识,当仿真一轮结束后,执行洗牌Shuffle)动作后,节点的INDEX可能会变化。

当在网络中查找某个节点时,总是按照INDEX遍历所有节点,以搜寻ID为某个特定值的节点。

 

  

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值