总结:PeerSim cycle-based

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) 加载配置后,通过调用适当的引擎运行实验,其标识如下:
此列表表示检查这些备选方案的顺序。 也就是说,如果多个返回true,那么第一个将被取。 注意,这个类只检查这些线索,不检查配置是否一致或有效。

4.教程
找到中文教程: http://hyhx2008.github.io/peersimshi-yong-jiao-cheng-2-jie-xi-cycle-basedmo-shi-fang-zhen.html (是第一步中第一个链接。有图片,有示例。)



项目结构:

ConfigProperties 用于处理配置文件的类。 通过处理文件,系统资源和命令行来扩展属性的功能。——>子类

ParsedProperties

ParsedProperties 扩展类配置属性与基本解析功能。

ConfigContainer 这个类是Configuration中使用的配置数据的容器; 看到类的更多信息。



整体释义:
笔记:
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只在某些特定的周期中运行,也可以在每一个周期中指定组件的执行顺序。



摘取:

在Peersim中首先要建立节点(节点模型),之后把节点连接起来(拓扑模型)

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

节点由ID和INDEX两个量来标识,

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

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

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




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();
Scheduler






网上也很少找到peersim的资源,本文也是有cycle-based , 对于cycle-based的大体解释应该还是有点用途的,了解cycle模拟需要一步一步的debug调试。总体来说难度不大,只是相关资源欠缺,且质量不太高。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值