仓酷云
标题:
JAVA网站制作之Java对等盘算理论:基于 IP 多播的发明...
[打印本页]
作者:
不帅
时间:
2015-1-18 11:53
标题:
JAVA网站制作之Java对等盘算理论:基于 IP 多播的发明...
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红,而开发出来的工具。
作者:
精灵巫婆
时间:
2015-1-21 16:45
Java是一种计算机编程语言,拥有跨平台、面向对java
作者:
爱飞
时间:
2015-1-25 21:33
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者:
仓酷云
时间:
2015-1-27 22:43
是一种为 Internet发展的计算机语言
作者:
admin
时间:
2015-2-5 10:54
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
作者:
深爱那片海
时间:
2015-2-11 09:21
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
作者:
再现理想
时间:
2015-3-2 08:28
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者:
冷月葬花魂
时间:
2015-3-6 00:31
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
作者:
小魔女
时间:
2015-3-12 17:09
是一种使用者不需花费很多时间学习的语言
作者:
简单生活
时间:
2015-3-20 00:46
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
作者:
因胸联盟
时间:
2015-4-6 03:08
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者:
兰色精灵
时间:
2015-4-11 03:11
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
作者:
飘飘悠悠
时间:
2015-4-22 09:50
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
作者:
若天明
时间:
2015-5-3 06:00
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
作者:
小妖女
时间:
2015-5-11 13:07
Java 编程语言的风格十分接近C、C++语言。
作者:
蒙在股里
时间:
2015-5-12 00:52
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
作者:
透明
时间:
2015-6-18 21:38
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
作者:
只想知道
时间:
2015-6-25 08:42
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者:
海妖
时间:
2015-7-5 01:36
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
作者:
灵魂腐蚀
时间:
2015-7-10 11:19
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2