快速业务通道

Java对等计算实践:基于IP多播的发现 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
。每个 MessageFactory 实例拥有一个随机生成的身份,它使用这个身份来从接收的消息中滤出要发送的消息。

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

Java对等计算实践:基于IP多播的发现(4)

时间:2010-12-14

Member 类

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

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

清单 3. MemberClient 类

private class MemberClient extends Thread { public void run() { try { while (true) { try { Message message = m_messagefactory.createSendMessage(); Reference reference = message.createReference(); message.writeReference(reference); message.sync(); byte [] arb = message.getByteArray(); DatagramPacket datagrampacket = new DatagramPacket(arb, arb.length); datagrampacket.setAddress(m_inetAddress); datagrampacket.setPort(m_nPort); MulticastSocket multicastsocket = new MulticastSocket(); multicastsocket.send(datagrampacket); } catch (IOException ioException) { ioException.printStackTrace(); } try { synchronized (this) { wait(m_nPeriod); } } catch (InterruptedException interruptedException) { break; } } } catch (Throwable throwable) { throwable.printStackTrace(); } } }

Java对等计算实践:基于IP多播的发现(5)

时间:2010-12-14

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

清单 4. MemberServer 类

private class MemberServer extends Thread { public void run() { try { MulticastSocket multicastsocket = new MulticastSocket(m_nPort); multicastsocket.joinGroup(m_inetAddress); while (true) { Message message = m_messagefactory.createReceiveMessage(); byte [] arb = message.getByteArray(); DatagramPacket datagrampacket = new DatagramPacket(arb, arb.length); multicastsocket.receive(datagrampacket); message.sync(); if (m_messagefactory.isMine(message) == false) { Reference reference = message.createReference(); message.readReference(reference); m_membermanager.addReference(reference); } } } catch (Throwable throwable) { throwable.printStackTrace(); } } }

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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多
你可能对下面的文章感兴趣
    HTTP/1.1 401 Access Denied

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号