专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »p2p技术 » 内部控制框架的构建:学会构建一个用于进行对等点发现的简单框架 »正文

内部控制框架的构建:学会构建一个用于进行对等点发现的简单框架

来源: 发布时间:星期三, 2008年12月17日 浏览:2次 评论:0
要完成有用工作P2P 应用对等点必须能够彼此发现对方并和对方交互在上篇文章中Todd 描述了几种区别机制对等点可以使用这些机制彼此发现他还解释了每种机制优缺点本月他提供了种基于 IP 多播发现实现

在软件Software实体能够参和具有 P2P 应用特征直接对等交互的前该实体必须发现将要和的交互适当对等点所有可行 P2P 体系结构都提供种针对发现问题解决方案我们研究了实现发现几种区别思路方法本月我将描述其中种机制实现让我们通过回顾来开始今天讨论

再访发现
对等点发现使 P2P 应用对等点能够彼此定位以便相互的间可以交互实现对等点发现服务有多种思路方法最简单机制是显式点到点配置这种机制通过要求每个对等点知道所有它可能和的交互其它对等点并和它们相连来进行工作点到点配置主要优点是简单主要缺点是缺乏灵活性并且缺少扩展到对等点大型网络能力

发现个公共模型是使用中央目录作为中介该模型在许多传统、非 P2P 分布式类型应用中间很流行其优点是很好理解对等点向中央目录注册自己存在并使用中央目录定位其它对等点这种模型主要优点是易于管理和扩展能力但是其集中化设计会导致单点故障因此它对自然力或网上冲浪人数增加所带来危害缺乏抵御能力

许多流行 P2P 应用使用网络模型而不是中央目录在网络模型中单个对等点只知道局域网络上对等点身份每个对等点都作为那些和的相连对等点目录对等点通过向相邻对等点传播目录查询并返回相关响应来进行合作这种模型主要优点是没有集中化主要缺点是由于传播查询耗费了大量网络和处理能力

上面 3种机制有无数种变体不讨论这些变体了让我们继续前进并研究另种发现机制

IP 多播发现
就每个对等点维护自己目录这点而言多播模型类似于网络模型但是对等点不通过合作来实现大规模网络查询另外对等点利用网络本身提供特性(IP 多播)来定位和标识其它对等点

IP 多播是无连接和不可靠(不象 TCP/IP 是面向连接和可靠)虽然它使用 IP 数据报;但是不象单播 IP 数据报那样是从台主机发送到另台主机多播 IP 数据报可以同时发往多台主机

对等点定期使用 IP 多播来宣布自己存在宣布包含了它们主机名和个用于正常通信端口对此消息感兴趣对等点检测这个消息后抽取出主机名和端口号并使用该消息建立个通信通道

回顾已经足够了让我们开始研究代码吧

简单客户机和服务器
我们将从个简单举例开始该举例演示了两个进程如何使用 IP 多播进行通信为了简化演示我将分别从客户机和服务器进程这两个方面来介绍举例P2P 应用通常会实现这两个进程将它们划分为客户机或服务器并不容易

在本例中服务器进程进行循环并等待数据报包到来每接收到个包服务器就会向控制台打印条简短诊断消息客户机角色要简单得多 — 它多播单个数据报包并退出

清单 1 和 2 介绍说明了这两部分是如何组合在代码中注释介绍说明了正在发生事情

清单 1. 简单服务器
public
Server
{
  public
 
  void
  (String ar)
  {
    try
    {
      // Create a multicast datagram for receiving IP
      //  multicast packets.  Join the multicast group at
      //  230.0.0.1, port 7777.
      MulticastSocket multicastSocket = MulticastSocket(7777);
      InetAddress inetAddress = InetAddress.getByName("230.0.0.1");
      multicastSocket.joinGroup(inetAddress);
      // Loop forever and receive messages from clients.  Pr
      //  the received messages.
      while (true)
      {
        arb = [100];
        DatagramPacket datagramPacket = DatagramPacket(arb, arb.length);
        multicastSocket.receive(datagramPacket);
        .out.prln( String(arb));
      }
    }
    catch (Exception exception)
    {
      exception.prStackTrace;
    }
  }
}




清单 2. 简单客户机
public
Client
{
  public
 
  void
  (String ar)
  {
    try
    {
      // Create a datagram package and send it to the multicast
      //  group at 230.0.0.1, port 7777.
      arb = {'h','e','l','l','o'};
      InetAddress inetAddress = InetAddress.getByName("230.0.0.1");
      DatagramPacket datagramPacket =
          DatagramPacket(arb, arb.length, inetAddress, 7777);
      MulticastSocket multicastSocket = MulticastSocket;
      multicastSocket.send(datagramPacket);
    }
    catch (Exception exception)
    {
      exception.prStackTrace;
    }
  }
}




java.net 包中两个类使它运行java.net.DatagramPacket 类保存了 IP 数据报包中包含数据java.net.MulticastSocket 类创建个调整到个特定多播组多播套接字

发现组件
尽管上述举例是个很好 IP 多播演示但它没有介绍说明实现基于 IP 多播对等点发现需要什么要使它有用我们需要个功能不仅限于发送和接收包软件Software组件理想情况下这个组件将了解它所接收源对等点并适当地丢弃些信息这些信息是有关那些它认为已经消失、死亡或以其它方式离去对等点

在这个新设计中对等点是个多播组成员请牢记发送到多播组消息会透明地路由到该组所有成员

设计包括两个核心类和 3个接口(我使用术语“接口”似乎不太严谨 — 在技术上是个接口和两个抽象类)Member 类例子是个多播组成员这个类管理所有通信细节MemberManager 类个例子负责了解参和多播组其它成员

对等点通过向多播组发送个消息来向属于多播组中对等点宣布自己存在每个消息包含有关发送消息对等点信息 — 通常是主机名和用于正常(和发现无关)通信端口Member 类和 MemberManager 类对这些消息内容几乎无所知对该信息访问权属于使用这两个类应用

有 3个接口跨越了消息传递/发现层和使用它应用层的间边界它们是 Reference 抽象类、Message 接口和 MessageFactory 抽象类应用必须提供这 3个接口实现

Reference 抽象类定义了对多播组成员引用MemberManager 类管理个引用集应用将实现这个类个具体版本它将包含应用所需要任何引用逻辑该类定义了两个思路方法名称是 equalsInternal 和 hashCodeInternal并且重新定义了 equals 和 hashCode 思路方法来这些思路方法它通过这样做来强制实现者为这两个关键功能提供实现 — MemberManager 依赖于它们

Message 接口定义了通过网络代码交换消息数据应用视图应用将该消息看作是相对于应用运行范围高级概念 — 类似于主机名和端口概念网络代码希望发送个由字节组成Message 接口实现定义了如何将这些高级信息和字节相互转换引用是信息个关键部分所有消息都必须包含因此该接口要求实现提供用于读和写 reference 思路方法

问题最后部分是 MessageFactory 抽象类这个类定义了生成新 Message 例子机制深藏在 Member 类内网络代码使用个工厂来创建从多播数据报中抽取出数据 Message 例子每个 MessageFactory 例子拥有个随机生成身份它使用这个身份来从接收消息中滤出要发送消息

总的这 5个类和接口(Member、MemberManager、Reference、Message 和 MessageFactory)构成了个用于进行对等点发现简单框架当然还有可以改进空间可以很容易地添加种基于事件机制用于向感兴趣侦听器通知成员出现或消失种用于过滤所接收消息灵活机制将很有用但其实现却比较困难我将这些建议留作读者作业

Member 类
上面描述框架完整源代码太长了这里就不详细展示了所以让我们只研究 Member 类部分代码其中包含了操作大多数内容更准确地说操作发生在两个内部类中:MemberClient 类和 MemberServer 类

请再次考虑第个举例它由个发送 IP 多播数据报客户机和个接收数据报服务器组成在本例中(清单 3 和 4)两个单独应用执行这两项功能P2P 应用对等点行为方式既象客户机又象服务器所以我们 P2P 应用应该同时包含两者才是适合

清单 3. MemberClient 类
private
MemberClient
extends Thread
{
  public
  void
  run
  {
    try
    {
      while (true)
      {
        try
        {
          Message message = m_messagefactory.createSendMessage;
          Reference reference = message.createReference;
          message.writeReference(reference);
          message.sync;
          arb = message.getByteArray;
          DatagramPacket datagrampacket = DatagramPacket(arb, arb.length);
          datagrampacket.Address(m_inetAddress);
          datagrampacket.Port(m_nPort);
          MulticastSocket multicast = MulticastSocket;
          multicast.send(datagrampacket);
        }
        catch (IOException ioException)
        {
          ioException.prStackTrace;
        }
        try
        {
          synchronized (this)
          {
            wait(m_nPeriod);
          }
        }
        catch (InterruptedException erruptedException)
        {
          ;
        }
      }
    }
    catch (Throwable throwable)
    {
      throwable.prStackTrace;
    }
  }
}




清单 3 包含了 MemberClient 类源代码象清单 1 中客户机这个客户机创建个 MulticastSocket 例子并使用它来发送个 DatagramPacket 例子DatagramPacket 例子包含个到发送方对等点引用该引用是作为字节编码只要该对等点还是活动并在运行客户机就会每隔段常规时间来广播这条信息

清单 4. MemberServer 类
private
MemberServer
extends Thread
{
  public
  void
  run
  {
    try
    {
      MulticastSocket multicast = MulticastSocket(m_nPort);
      multicast.joinGroup(m_inetAddress);
      while (true)
      {
        Message message = m_messagefactory.createReceiveMessage;
        arb = message.getByteArray;
        DatagramPacket datagrampacket = DatagramPacket(arb, arb.length);
        multicast.receive(datagrampacket);
        message.sync;
        (m_messagefactory.isMine(message) false)
        {
          Reference reference = message.createReference;
          message.readReference(reference);
          m_membermanager.addReference(reference);
        }
      }
    }
    catch (Throwable throwable)
    {
      throwable.prStackTrace;
    }
  }
}




MemberServer 类在很多方面类似于清单 2 中服务器除了创建必需代码使用它从建立通信(wire)上采集适当数据报以外这个服务器还对已编码引用进行解码、创建消息并将消息传递到 MemberManager 例子进行保管干得不错

该类其余部分由用于各种特性读思路方法和写思路方法以及用于控制该类生命周期 start 和 stop 思路方法组成

P2P 应用
对等点发现框架完成了剩下所有工作就是将它集成到现有 P2P 应用中去了对原来 P2P 应用更改相对较少

首先在其前身中P2P 应用期望在其特性文件中列出所有已知对等点尽管这对演示用途来说很好(请回忆上面讨论点到点配置)并在最多至大约 4个对等点情况下运行良好但最终它限制还是太大了因此除去了在特性文件中读取和管理对等点代码并以使用上面发现机制代码取代它

其次在特性文件中枚举了对等点看上去它们就好象持久存在了现有应用如果假定它们不会消失有时会侥幸获得成功但是在 P2P 真实世界中事情更易发生变化应用进行了重新设计适于在对等点消失时进行更好恢复

更新源代码可在参考资料中得到

结束语
找到对等点只是成功了次我将研究个难题涉及两个对等点在现代因特网上通信要克服防火墙、网关以及其它大堆麻烦

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: