当前位置:天才代写 > tutorial > JAVA 教程 > Java对等计较实践:基于IP多播的发明

Java对等计较实践:基于IP多播的发明

2017-11-11 08:00 星期六 所属: JAVA 教程 浏览:387

副标题#e#

要完成有用的事情,P2P 应用措施中的对等点必需可以或许互相发明对方并与对方交互。本文提供了一种基于 IP 多播的发明的实现。

在软件实体可以或许参加具有 P2P 应用措施特征的直接的对等交互之前,该实体必需发明将要与之交互的适当的对等点。所有可行的 P2P 体系布局都提供一种针对发明问题的办理方案。在本文我将描写个中一种机制的实现。让我们通过回首来开始本日的接头。再访发明 对等点发明使 P2P 应用措施中的对等点可以或许互相定位以便彼此之间可以交互。实现对等点发明处事有多种要领。最简朴的机制是显式点到点设置。这种机制通过要求每个对等点知道所有它大概与之交互的其它对等点,并与它们相连,来举办事情。点到点设置的主要利益是简朴。它的主要缺点是缺乏机动性而且缺少扩展到对等点的大型网络的本领。

发明的另一个民众模子是利用中央目次作为中介。该模子在很多传统的、非 P2P 漫衍式范例的应用措施中间很风行,其利益是很好领略。对等点向中央目次注册本身的存在,并利用中央目次定位其它对等点。这种模子的主要利益是易于打点和扩展的本领。可是,其会合化设计会导致单点妨碍,因此它对自然力或网上冲浪人数增加所带来的危害缺乏抵制本领。

很多风行的 P2P 应用措施利用网络模子而不是中央目次,在网络模子中,单个对等点只知道局域网络上的对等点身份。每个对等点都作为那些与之相连的对等点的目次。对等点通过向相邻对等点流传目次查询并返回相关的响应来举办相助。这种模子的主要利益是没有会合化。它的主要缺点是由于流传查询淹灭了大量的网络和处理惩罚本领。

上面三种机制有无数种变体。不接头这些变体了,让我们继承前进并研究另一种发明机制。

IP 多播发明

就每个对等点维护本身的目次这点而言,多播模子雷同于网络模子。可是,对等点不通过相助来实现大局限网络查询。别的,对等点操作网络自己提供的特性(IP 多播)来定位和标识其它对等点。

IP 多播是无毗连和不行靠的(不象 TCP/IP 是面向毗连和靠得住的)。固然它利用 IP 数据报;可是不象单播 IP 数据报那样是从一台主机发送到另一台主机,多播 IP 数据报可以同时发往多台主机。

对等点按期利用 IP 多播来公布本身的存在。公布包括了它们的主机名和一个用于正常通信的端口。对此动静感乐趣的对等点检测这个动静后,抽取出主机名和端标语,并利用该动静成立一个通信通道。

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


#p#副标题#e#

简朴的客户机与处事器

我们将从一个简朴的示例开始,该示例演示了两个历程如何利用 IP 多播举办通信。为了简化演示,我将别离从客户机和处事器历程这两个方面来先容示例。P2P 应用措施凡是会实现这两个历程,将它们分别为客户机或处事器并不容易。

在本例中,处事器历程举办轮回并期待数据报包的到来。每吸收到一个包,处事器就会向节制台打印一条简短的诊断动静。客户机脚色要简朴得多 — 它多播单个数据报包并退出。

清单 1 和 2 说明白这两部门是如何组合在一起的。代码中的注释说明白正在产生的工作。

清单 1. 简朴处事器

public
class Server
{
public
static
void
main(String [] arstring)
{
try
{
// Create a multicast datagram socket for receiving IP
// multicast packets. Join the multicast group at
// 230.0.0.1, port 7777.
MulticastSocket multicastSocket = new MulticastSocket(7777);
InetAddress inetAddress = InetAddress.getByName("230.0.0.1");
multicastSocket.joinGroup(inetAddress);
// Loop forever and receive messages from clients. Print
// the received messages.
while (true)
{
byte [] arb = new byte [100];
DatagramPacket datagramPacket = new DatagramPacket(arb, arb.length);
multicastSocket.receive(datagramPacket);
System.out.println(new String(arb));
}
}
catch (Exception exception)
{
exception.printStackTrace();
}
}
}

清单 2. 简朴客户机

public
class Client
{
public
static
void
main(String [] arstring)
{
try
{
// Create a datagram package and send it to the multicast
// group at 230.0.0.1, port 7777.
byte [] arb = new byte [] {'h','e','l','l','o'};
InetAddress inetAddress = InetAddress.getByName("230.0.0.1");
DatagramPacket datagramPacket =
new DatagramPacket(arb, arb.length, inetAddress, 7777);
MulticastSocket multicastSocket = new MulticastSocket();
multicastSocket.send(datagramPacket);
}
catch (Exception exception)
{
exception.printStackTrace();
}
}
}

#p#分页标题#e#

java.net 包中的两个类使它运行。java.net.DatagramPacket 类生存了 IP 数据报包中包括的数据。java.net.MulticastSocket 类建设一个调解到一个特定多播组的多播套接字。

#p#副标题#e#

发明组件

尽量上述示例是一个很好的 IP 多播的演示,但它没有说明实现基于 IP 多播的对等点发明需要什么。要使它有用,我们需要一个成果不只限于发送和吸收包的软件组件。抱负环境下,这个组件将相识它所吸收的包的源对等点,并适内地扬弃一些信息,这些信息是关于那些它认为已经消失、灭亡或以其它方法拜另外对等点的。

在这个新设计中,对等点是一个多播组的成员。请紧记,发送到多播组的动静会透明地路由到该组的所有成员。

设计包罗两个焦点类和三个接口(我利用术语“接口”好像不太严谨 — 在技能上是一个接口和两个抽象类)。Member 类的实例是一个多播组的成员。这个类打点所有的通信细节。MemberManager 类的一个实例认真相识参加多播组的其它成员。

 对等点通过向多播组发送一个动静,来向属于多播组中的对等点公布本身的存在。每个动静包括关于发送动静的对等点的信息 — 凡是是主机名和用于正常(与发明无关)通信的端口。Member 类和 MemberManager 类对这些动静的内容险些一无所知。对该信息的会见权属于利用这两个类的应用措施。

有三个接口超过了动静通报/发明层和利用它的应用措施层之间的界线。它们是 Reference 抽象类、Message 接口和 MessageFactory 抽象类。应用措施必需提供这三个接口的实现。

Reference 抽象类界说了对多播构成员的引用。MemberManager 类打点一个引用集。应用措施将实现这个类的一个详细版本,它将包括应用措施所需要的任何引用逻辑。该类界说了两个要领,名称是 equalsInternal() 和 hashCodeInternal(),而且从头界说了 equals() 和 hashCode() 要领来挪用这些要领。它通过这样做来强制实现者为这两个要害成果提供实现 — MemberManager 依赖于它们。

Message 接口界说了通过网络代码互换的动静数据的应用措施视图。应用措施将该动静看作是相对付应用措施运行范畴的高级观念 — 雷同于主机名和端口的观念。网络代码但愿发送一个由字节构成的包。Message 接口的实现界说了如何将这些高级信息与字节彼此转换。引用是信息的一个要害部门,所有动静都必需包括,因此该接口要求实现提供用于读和写 reference 的要领。

问题的最后部门是 MessageFactory 抽象类。这个类界说了生成新的 Message 实例的机制。深藏在 Member 类内的网络代码利用一个工场来建设从多播数据报中抽取出的数据的 Message 实例。每个 MessageFactory 实例拥有一个随机生成的身份,它利用这个身份来从吸收的动静中滤出要发送的动静。

总之,这五个类和接口(Member、MemberManager、Reference、Message 和 MessageFactory)组成了一个用于举办对等点发明的简朴框架。虽然,尚有可以改造的空间。可以很容易地添加一种基于事件的机制,用于向感乐趣的侦听器通知成员的呈现或消失。一种用于过滤所吸收动静的机念头制将很有用,但其实现却较量坚苦。我将这些发起留作读者的功课。

#p#副标题#e#

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

#p#副标题#e#

#p#分页标题#e#

清单 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 实例举办保管。干得不错。

该类的其余部门由用于各类特性的读要领和写要领以及用于节制该类的生命周期的 start()和 stop()要领构成。

P2P 应用措施

对等点发明框架完成了,剩下的所有事情就是将它集成到现有的 P2P 应用措施中去了。对本来的 P2P 应用措施的变动相对较少。

首先,在其前身中,P2P 应用措施期望在其特性文件中列出所有已知的对等点。尽量这对演示用途来说很好(请回想上面接头的点到点设置),并在最多至约莫四个对等点的环境下运行精采,但最终它的限制照旧太大了。因此,撤除了在特性文件中读取和打点对等点的代码,并以利用上面的发明机制的代码代替它。

其次,因为在特性文件中列举了对等点,看上去它们就好象耐久存在了。现有的应用措施假如假定它们不会消失,有时会荣幸得到乐成。可是,在P2P的真实世界中,工作更易产生变革。新的应用措施举办了从头设计,适于在对等点消失时举办更好的规复。

更新的源代码可在参考资料中获得。

竣事语

找到对等点只是乐成了一半。下一次我将研究一个困难,涉及两个对等点在现代因特网上的通信,要降服防火墙、网关以及其它一大堆贫苦。

 

    关键字:

天才代写-代写联系方式