|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
Java到底会发战成什么样,让我们拭目以待吧,我始终坚信着java会更好。以上都是俺个人看法,欢迎大家一起交流.要完成有效的事情,P2P使用程序中的对等点必需可以相互发明对方并与对方交互。本文供应了一种基于IP多播的发明的完成。
在软件实体可以介入具有P2P使用程序特性的间接的对等交互之前,该实体必需发明将要与之交互的得当的对等点。一切可行的P2P系统布局都供应一种针对发明成绩的办理计划。在本文我将形貌个中一种机制的完成。让我们经由过程回忆来入手下手明天的会商。再访发明对等点发明使P2P使用程序中的对等点可以相互定位以便互相之间能够交互。完成对等点发明服务有多种办法。最复杂的机制是显式点到点设置。这类机制经由过程请求每一个对等点晓得一切它大概与之交互的别的对等点,并与它们相连,来举行事情。点到点设置的次要长处是复杂。它的次要弱点是缺少天真性而且短少扩大到对等点的年夜型收集的才能。
发明的另外一个大众模子是利用中心目次作为中介。该模子在很多传统的、非P2P散布式范例的使用程序两头很盛行,其长处是很好了解。对等点向中心目次注册本人的存在,并利用中心目次定位别的对等点。这类模子的次要长处是易于办理和扩大的才能。可是,其会合化计划会招致单点妨碍,因而它对天然力或网上冲游勇数增添所带来的伤害缺少抵抗才能。
很多盛行的P2P使用程序利用收集模子而不是中心目次,在收集模子中,单个对等点只晓得局域收集上的对等点身份。每一个对等点都作为那些与之相连的对等点的目次。对等点经由过程向相邻对等点传布目次查询并前往相干的呼应来举行互助。这类模子的次要长处是没有会合化。它的次要弱点是因为传布查询泯灭了大批的收集和处置才能。
下面三种机制有没有数种变体。不会商这些变体了,让我们持续行进并研讨另外一种发明机制。
IP多播发明
就每一个对等点保护本人的目次这点而言,多播模子相似于收集模子。可是,对等点欠亨过互助来完成年夜范围收集查询。别的,对等点使用收集自己供应的特征(IP多播)来定位和标识别的对等点。
IP多播是无毗连和不成靠的(不象TCP/IP是面向毗连和牢靠的)。固然它利用IP数据报;可是不象单播IP数据报那样是从一台主机发送到另外一台主机,多播IP数据报能够同时发往多台主机。
对等点按期利用IP多播来公布本人的存在。公布包括了它们的主机名和一个用于一般通讯的端口。对此动静感乐趣的对等点检测这个动静后,抽掏出主机名和端标语,并利用该动静创建一个通讯通道。
回忆已充足了。让我们入手下手研讨代码吧
复杂的客户机与服务器
我们将从一个复杂的示例入手下手,该示例演示了两个历程怎样利用IP多播举行通讯。为了简化演示,我将分离从客户机和服务器历程这两个方面来先容示例。P2P使用程序一般会完成这两个历程,将它们分别为客户机或服务器其实不简单。
在本例中,服务器历程举行轮回并守候数据报包的到来。每吸收到一个包,服务器就会向把持台打印一条冗长的诊断动静。客户机脚色要复杂很多?它多播单个数据报包并加入。
清单1和2申明了这两部分是怎样组合在一同的。代码中的正文申明了正在产生的事变。
清单1.复杂服务器
public
classServer
{
public
static
void
main(String[]arstring)
{
try
{
//CreateamulticastdatagramsocketforreceivingIP
//multicastpackets.Jointhemulticastgroupat
//230.0.0.1,port7777.
MulticastSocketmulticastSocket=newMulticastSocket(7777);
InetAddressinetAddress=InetAddress.getByName("230.0.0.1");
multicastSocket.joinGroup(inetAddress);
//Loopforeverandreceivemessagesfromclients.Print
//thereceivedmessages.
while(true)
{
byte[]arb=newbyte[100];
DatagramPacketdatagramPacket=newDatagramPacket(arb,arb.length);
multicastSocket.receive(datagramPacket);
System.out.println(newString(arb));
}
}
catch(Exceptionexception)
{
exception.printStackTrace();
}
}
}
清单2.复杂客户机
public
classClient
{
public
static
void
main(String[]arstring)
{
try
{
//Createadatagrampackageandsendittothemulticast
//groupat230.0.0.1,port7777.
byte[]arb=newbyte[]{h,e,l,l,o};
InetAddressinetAddress=InetAddress.getByName("230.0.0.1");
DatagramPacketdatagramPacket=
newDatagramPacket(arb,arb.length,inetAddress,7777);
MulticastSocketmulticastSocket=newMulticastSocket();
multicastSocket.send(datagramPacket);
}
catch(Exceptionexception)
{
exception.printStackTrace();
}
}
}
java.net包中的两个类使它运转。java.net.DatagramPacket类保留了IP数据报包中包括的数据。java.net.MulticastSocket类创立一个调剂到一个特定多播组的多播套接字。
发明组件
只管上述示例是一个很好的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)组成了一个用于举行对等点发明的复杂框架。固然,另有能够改善的空间。能够很简单地增加一种基于事务的机制,用于向感乐趣的侦听器关照成员的呈现或消散。一种用于过滤所吸收动静的天真机制将很有效,但实在现却对照坚苦。我将这些倡议留作读者的功课。
Member类
下面形貌的框架的完全源代码太长了,这里就不具体展现了,以是让我们只研讨Member类的部分代码,由于个中包括了操纵的年夜多半内容。更正确地说,操纵产生在两个外部类中:MemberClient类和MemberServer类。
请再次思索第一个示例。它由一个发送IP多播数据报的客户机和一个吸收数据报的服务器构成。在本例中(清单3和4),两个独自的使用程序实行这两项功效。P2P使用程序中的对等点的举动体例既象客户机又象服务器,以是我们的P2P使用程序应当同时包括二者才是合适的。
清单3.MemberClient类
private
classMemberClient
extendsThread
{
public
void
run()
{
try
{
while(true)
{
try
{
Messagemessage=m_messagefactory.createSendMessage();
Referencereference=message.createReference();
message.writeReference(reference);
message.sync();
byte[]arb=message.getByteArray();
DatagramPacketdatagrampacket=newDatagramPacket(arb,arb.length);
datagrampacket.setAddress(m_inetAddress);
datagrampacket.setPort(m_nPort);
MulticastSocketmulticastsocket=newMulticastSocket();
multicastsocket.send(datagrampacket);
}
catch(IOExceptionioException)
{
ioException.printStackTrace();
}
try
{
synchronized(this)
{
wait(m_nPeriod);
}
}
catch(InterruptedExceptioninterruptedException)
{
break;
}
}
}
catch(Throwablethrowable)
{
throwable.printStackTrace();
}
}
}
清单3包括了MemberClient类的源代码。象清单1中的客户机一样,这个客户机创立一个MulticastSocket实例并利用它来发送一个DatagramPacket实例。DatagramPacket实例包括一个到发送方对等点的援用,该援用是作为字节数组编码的。只需该对等点仍是举动的并在运转,客户机就会每隔一段惯例工夫来播送这条信息。
清单4.MemberServer类
private
classMemberServer
extendsThread
{
public
void
run()
{
try
{
MulticastSocketmulticastsocket=newMulticastSocket(m_nPort);
multicastsocket.joinGroup(m_inetAddress);
while(true)
{
Messagemessage=m_messagefactory.createReceiveMessage();
byte[]arb=message.getByteArray();
DatagramPacketdatagrampacket=newDatagramPacket(arb,arb.length);
multicastsocket.receive(datagrampacket);
message.sync();
if(m_messagefactory.isMine(message)==false)
{
Referencereference=message.createReference();
message.readReference(reference);
m_membermanager.addReference(reference);
}
}
}
catch(Throwablethrowable)
{
throwable.printStackTrace();
}
}
}
MemberServer类在良多方面相似于清单2中的服务器。除创立必须的代码,利用它从创建的通讯(wire)上收罗得当的数据报之外,这个服务器还对已编码的援用举行解码、创立动静并将动静传送到MemberManager实例举行保管。干得不错。
该类的其他部分由用于各类特征的读办法和写办法和用于把持该类的性命周期的start()和stop()办法构成。
P2P使用程序
对等点发明框架完成了,剩下的一切事情就是将它集成到现有的P2P使用程序中往了。对本来的P2P使用程序的变动绝对较少。
起首,在其前身中,P2P使用程序希冀在其特征文件中列出一切已知的对等点。只管这对演示用处来讲很好(请回想下面会商的点到点设置),并在最多至约莫四个对等点的情形下运转优秀,但终极它的限定仍是太年夜了。因而,撤除了在特征文件中读取和办理对等点的代码,并以利用下面的发明机制的代码代替它。
其次,由于在特征文件中列举了对等点,看上往它们就好象耐久存在了。现有的使用程序假如假定它们不会消散,偶然会幸运取得乐成。可是,在P2P的实在天下中,事变更容易产生变更。新的使用程序举行了从头计划,适于在对等点消散时举行更好的恢复。
更新的源代码可在参考材料中失掉
不得不提一下的是:.net是看到java红,而开发出来的工具。 |
|