Peer-to-Peer (P2P)Sockets工程在JXTA peer-to-peer虚拟网络重新实现了对应于标准TCP/IP网络中的Java标准的Socket,ServerSocket,和InetAddress等类。该工程同时还引入了一些注入Jetty web server,Apache XML-RPC客户端和服务器库,Apache Jasper JSP引擎之类的流行web package。使这些服务可以运行在Peer-to-Peer Sockets 的框架下。
在这片文章结束的时候,你会理解对P2P Sockets packages的需求和以及开发它的动机,学会怎么配置P2P Socket 库使之在你的系统上能够运行,学会怎么样建立P2P的服务器和客户端Socket,怎么使用P2P的InetAddress 类,还包括框架下的安全问题以及它的局限性。
动机 P2P Socket工程的设计的使用对象是对以下几个领域有兴趣的开发者:
●将Internet回归到end-to-end的原则当中
●一种绕过ICANN和Verisign的替代peer-to-peer域名系统,这个系统是完全分布式的,对更新拥有比标准DNS快的多的响应速度。
●一种任何人都可以建立活着使用网络服务的Internet,及时他们使用动态的IP地址或是没有IP地址,或是只有内网地址(NAT),或者是在ISP的防火墙之后。
●一个每一个Peer都能够自动的建立一个Web Server,提供XML-RPC服务,能够快速的将这种服务提供给其他的Peer。
●使为Peer-to-Peer网络添加Java Socket和ServerSocket 的应用更加容易
●享受更酷的科技
P2P Socket 工程在JXTA peer-to-peer网络上重新实现了标准java.net报当中的类。一些人可能要问“难道标准TCP/IP socket和ServerSocket不是已经是peer-to-peer的了吗?”标准的TCP/IP socket和server socket在理论上是peer-to-peer的,不过由于防火墙,NAT设备,以及DNS所存在的政治或是技术的问题,在实际上却没有做到这一点。首先,Internet上的许多peer使用的都是通过DHCP协议取得的动态IP,这些IP由通过NAT设备共享和过滤,还有一些IP地址由于防火墙的限制,很难被访问到。在这样的条件下建立server socket应用要么是不可能的,要么就需要在应用层进行精妙的控制来绕过这些限制。其次,TCP/IP Socket依赖于DNS系统来将用户友好的主机名转变为IP地址。DNS在理论上就是办分布式的,但是在管理层面上,DNS是在ICANN下集中式管理的,而ICANN是一个反应迟钝的,没有创新意识的组织。再次,标准的DNS对对那些过滤或是使用动态IP地址的edge-peer支持的并不好,更新需要花费很长的时间传播下去而且并不提供presence信息。对那些想要开发能够扩展DNS到新的领域(例如将即时消息的用户名和存在信息加入到DNS)的新应用的开发者来说,DNS系统的技术和政治因素阻碍了他们的工作。
JXTA是一个用于在TCP/IP之上建立peer-to-peer覆盖网络的开源工程。在网络中的没一个peer都会被分配到一个和IP地址类似的号码,即时他们没有固定的IP地址或是出在防火墙之后。在JXTA 网络上的super-peer通讯运行应用层的路由协议来储存例如如果到达其他的peer,如何加入peer group,其他peer提供了怎么样的内容之类的信息。JXTA应用层在Peer之间提供了中继的代理服务,是出在防火墙或是NAT后的Peer可以正常的通信。Peer可以自己组织成为Peer Group,这样可以将所有的查询请求限定在natural security container当中。任何peer都可以分布式的建立并发布一个peer group,其他的Peer通过使用其他的super-peer可以搜索并发现这些peer group。Peer之间的通信通过pipe的方式来进行,这和Unix系统当中的Pipe非常的类似。Pipe是对两个peer之间通讯方式的一种抽象,它帮助peer互相通讯,即使他们处在不同的网络区域当中。
JXTA是一种非常强大的框架。但是,它并不是一种容易学习的框架,将现有的软件移植到JXTA下也不是一件容易的事情。P2P Sockets成功地将JXTA隐藏起来,使之看起来就像是传统的TCP/IP网络。如果peer想要成为服务器,他只需要简单的使用包含他们想使用的domain name和端口的P2P Server Socket就可以了。P2P的客户端可以通过host名和特定的端口号来建立Socket连接访问那些服务。Host可以被解析为域名,例如www.nike.laborpolicy,或是IP地址,例如44.22.33.22。在这些场景之后,host实际被解析为JXTA原语,而不是被解析为DNS或是TCP/IP。举例来说:域名www.nike.laborpolicy实际上是JXTA peer group 的广告消息中的一个NAME字段。P2P Sockets和Server socket 与正常的TCP/IP Socket和ServerSocket的使用方法完全相同。我们为希望了解内幕和那些已经懂得JXTA的用户提供了一张表(http://www.onjava.com/onjava/2003/12/03/examples/table.html),在这张表中可以查询到传统TCP/IP概念上的域名,IP地址等概念和JXTA中对等概念的对应关系。
使用这种方式的好处是多方面的。首先,程序员可以将他们在标准TCP/IP Socket和Server Socket的知识应用到JXTA peer-to-peer网络当中而不需要专门学习JXTA。其次,所有的P2P Socket 的代码都是标准java.net中类的子类,例如java.net.Socket,所以现存的网络应用可以很容易的移植到peer-to-peer网络当中。 P2P Socket工程已经将很多现存的软件移植到了peer-to-peer网络当中,其中包括web服务器(Jetty),它可以接收请求,被在peer-to-peer 网络上提供内容服务;一个servlet和JSP引擎(Jetty 和 Jsper),它可以使现存的servlet和JSP直接在P2P网络中应用;一个XML-RPC客户端和服务器(Apache XML-RPC),它可以访问和对外提供P2P XML-RPC 端点;一个HTTP/1.1客户端(Apache Commons HTTP-Client),它可以访问P2P的web 服务器;一个网关(Smart Cache),它可以是现有浏览器访问P2P的P2P web 站点;和WikiWiki(JSPWiki),它能够在你的主机上建立Wiki站点,使其他的Peer可以通过P2P网络访问,并编辑。所有的这些软件在移植之后都能够正常的使用并且和以前看起来完全一样。P2P Socket的抽象非常的成功,移植这些软件所花费的时间仅仅是30分钟到几个小时不等。P2P Socket工程是完全开源的,大部分都采用BSD-type证书,由于是使用Java编写的,所以也具有跨平台的特性。
由于P2P Socket是建立在JXTA之上的,所以它可以很容易的处理一些传统的ServerSocket和Socket所不能处理的情况。第一,在P2P Socket上建立的ServerSocket,具有fail-over(不知道怎么翻译,应该是可靠性之类的意思)和易扩展的特性。如果不同的Peer可以启动ServerSocket使用同一个域名和端口,例如www.nike.laborpolicy 端口号:80。当一个客户端打开P2P socket连接到www.nike.laborpolicy 端口号:80时,它会随机的连接到一个提供一个使用这个域名和端口的主机上。所有的这些服务器Peer可能提供同样的Web页面,这就是可以将用户的请求分布到不同的服务器之上同时也就使得某一个服务器的崩溃更容易被恢复。这一点和DNS round-robin非常的相似,在DNS round-robin当中一个域名可以被解析为多个IP地址用来进行负载均衡。第二,由于P2P Socket并不使用DNS系统,主机名可以任意指定。用户可以建立他自己的个性结尾,例如www.boobah.cat 或是www.cynthia.goddess,或是应用确定的名字,例如一个即使消息系统使用Brad GNUberg或是Fidget666当作域名。第三,一个指定域名的服务端口可以分布在全世界很多的Peer当中。举例来说,假设你有一个虚拟主机名www.nike.laborpolicy,一个Peer可以在80端口提供web页面,另一个Peer可以使用2000端口提供即时消息,最后一个Peer可以在3000端口为其他Peer提供即时的RSS更新。现在一个域名可以由很多分布不同的Peer协同在一起提供服务。
需求与配置 要开发和使用P2P Socket你必须下载和安装一下的这些软件。
●JDK 1.4+
P2P Socket只能工作在JDK 1.4或是更新版本的Java虚拟机之上,由于P2P Socket是Java.net.InetAddress的子类,在1.4之前,这个类是final类型的。
●Ant 1.5.3+
用来构建和运行P2P Socket以及类似于Jetty 和 Jasper之类的扩展
●P2PSockets-1.0-beta1.zip
P2P Socket 的最新发布包 安装和配置好JDK和Ant,并保证它们都可以在命令行下正确运行。将P2PSockets-1.0-beta1.zip解开到硬盘上。在目录名当中不能出现空格,否则P2P Sockets的构建文件不能正常工作。
必须将JAR文件p2psockets/lib/ant-contrib-0.5.jar加入到你的CLASSPATH当中去。在Windows当中可以使用下面这个命令:
set CLASSPATH=%CLASSPATH%;c:\p2psockets\lib\ant-contrib-0.5.jar
P2P Sockets的目录包含两个不同的子目录,test/clientpeer和test/serverpeer,它们中有已经设置好的JXTA配置信息(分别在test/clientpeer/.JXTA和test/serverpeer/.JXTA当中)。如果你想要了解更多的关于JXTA的配置问题,你可以阅读JXTA配置指南。两个测试peer已经被配置为最差的情况下工作模式,也就是peer处在防火墙或是NAT设备之后,也就是说用户必须使用其他的中间Peer来中继它们的请求。如果用户不处在这种环境下,这种配置方式也是可以工作的。使用JXTA的一个好处就是,当你在使用这个系统的时候,它对你的程序几乎是透明的。
当你在测试本文中的代码的时候,你必须连接到Internet。这样做基于一下的两个原因:首先,例子程序使用Sun提供的公共JXTA服务器来将启动peer引入JXTA网络当中;其次,在一些操作系统上(例如Windows XP, 缺省),网络系统在你没有连接到网络上时会自动关闭,这样就会阻碍运行在同一个主机上的客户端peer和服务器peer互相通讯。
建立一个P2P Server Socket
建立一个P2P server Socket的方法和建立一个标准的java.net.Server