国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

Peer-to-Peer Sockets 工程入門

瀏覽:115日期:2024-07-19 13:55:20
內(nèi)容: Peer-to-Peer Sockets 工程入門作者:Brad Neuberg譯者:gracepig [email protected]版權(quán)聲明:可以任意轉(zhuǎn)載,轉(zhuǎn)載時請務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明作者:Brad Neuberg ;gracepig原文地址:http://www.onjava.com/pub/a/onjava/2003/12/03/p2psockets.html中文地址:http://www.matrix.org.cn/resource/article/43/43854_Peer-to-Peer-Sockets.html關(guān)鍵詞: Peer-to-Peer SocketsPeer-to-Peer (P2P)Sockets工程在JXTA peer-to-peer虛擬網(wǎng)絡(luò)重新實現(xiàn)了對應(yīng)于標(biāo)準(zhǔn)TCP/IP網(wǎng)絡(luò)中的Java標(biāo)準(zhǔn)的Socket,ServerSocket,和InetAddress等類。該工程同時還引入了一些注入Jetty web server,Apache XML-RPC客戶端和服務(wù)器庫,Apache Jasper JSP引擎之類的流行web package。使這些服務(wù)可以運行在Peer-to-Peer Sockets 的框架下。在這片文章結(jié)束的時候,你會理解對P2P Sockets packages的需求和以及開發(fā)它的動機(jī),學(xué)會怎么配置P2P Socket 庫使之在你的系統(tǒng)上能夠運行,學(xué)會怎么樣建立P2P的服務(wù)器和客戶端Socket,怎么使用P2P的InetAddress 類,還包括框架下的安全問題以及它的局限性。動機(jī)P2P Socket工程的設(shè)計的使用對象是對以下幾個領(lǐng)域有興趣的開發(fā)者:●將Internet回歸到end-to-end的原則當(dāng)中●一種繞過ICANN和Verisign的替代peer-to-peer域名系統(tǒng),這個系統(tǒng)是完全分布式的,對更新?lián)碛斜葮?biāo)準(zhǔn)DNS快的多的響應(yīng)速度。●一種任何人都可以建立活著使用網(wǎng)絡(luò)服務(wù)的Internet,及時他們使用動態(tài)的IP地址或是沒有IP地址,或是只有內(nèi)網(wǎng)地址(NAT),或者是在ISP的防火墻之后。●一個每一個Peer都能夠自動的建立一個Web Server,提供XML-RPC服務(wù),能夠快速的將這種服務(wù)提供給其他的Peer。●使為Peer-to-Peer網(wǎng)絡(luò)添加Java Socket和ServerSocket 的應(yīng)用更加容易●享受更酷的科技P2P Socket 工程在JXTA peer-to-peer網(wǎng)絡(luò)上重新實現(xiàn)了標(biāo)準(zhǔn)java.net報當(dāng)中的類。一些人可能要問“難道標(biāo)準(zhǔn)TCP/IP socket和ServerSocket不是已經(jīng)是peer-to-peer的了嗎?標(biāo)準(zhǔn)的TCP/IP socket和server socket在理論上是peer-to-peer的,不過由于防火墻,NAT設(shè)備,以及DNS所存在的政治或是技術(shù)的問題,在實際上卻沒有做到這一點。首先,Internet上的許多peer使用的都是通過DHCP協(xié)議取得的動態(tài)IP,這些IP由通過NAT設(shè)備共享和過濾,還有一些IP地址由于防火墻的限制,很難被訪問到。在這樣的條件下建立server socket應(yīng)用要么是不可能的,要么就需要在應(yīng)用層進(jìn)行精妙的控制來繞過這些限制。其次,TCP/IP Socket依賴于DNS系統(tǒng)來將用戶友好的主機(jī)名轉(zhuǎn)變?yōu)镮P地址。DNS在理論上就是辦分布式的,但是在管理層面上,DNS是在ICANN下集中式管理的,而ICANN是一個反應(yīng)遲鈍的,沒有創(chuàng)新意識的組織。再次,標(biāo)準(zhǔn)的DNS對對那些過濾或是使用動態(tài)IP地址的edge-peer支持的并不好,更新需要花費很長的時間傳播下去而且并不提供presence信息。對那些想要開發(fā)能夠擴(kuò)展DNS到新的領(lǐng)域(例如將即時消息的用戶名和存在信息加入到DNS)的新應(yīng)用的開發(fā)者來說,DNS系統(tǒng)的技術(shù)和政治因素阻礙了他們的工作。JXTA是一個用于在TCP/IP之上建立peer-to-peer覆蓋網(wǎng)絡(luò)的開源工程。在網(wǎng)絡(luò)中的沒一個peer都會被分配到一個和IP地址類似的號碼,即時他們沒有固定的IP地址或是出在防火墻之后。在JXTA 網(wǎng)絡(luò)上的super-peer通訊運行應(yīng)用層的路由協(xié)議來儲存例如如果到達(dá)其他的peer,如何加入peer group,其他peer提供了怎么樣的內(nèi)容之類的信息。JXTA應(yīng)用層在Peer之間提供了中繼的代理服務(wù),是出在防火墻或是NAT后的Peer可以正常的通信。Peer可以自己組織成為Peer Group,這樣可以將所有的查詢請求限定在natural security container當(dāng)中。任何peer都可以分布式的建立并發(fā)布一個peer group,其他的Peer通過使用其他的super-peer可以搜索并發(fā)現(xiàn)這些peer group。Peer之間的通信通過pipe的方式來進(jìn)行,這和Unix系統(tǒng)當(dāng)中的Pipe非常的類似。Pipe是對兩個peer之間通訊方式的一種抽象,它幫助peer互相通訊,即使他們處在不同的網(wǎng)絡(luò)區(qū)域當(dāng)中。JXTA是一種非常強大的框架。但是,它并不是一種容易學(xué)習(xí)的框架,將現(xiàn)有的軟件移植到JXTA下也不是一件容易的事情。P2P Sockets成功地將JXTA隱藏起來,使之看起來就像是傳統(tǒng)的TCP/IP網(wǎng)絡(luò)。如果peer想要成為服務(wù)器,他只需要簡單的使用包含他們想使用的domain name和端口的P2P Server Socket就可以了。P2P的客戶端可以通過host名和特定的端口號來建立Socket連接訪問那些服務(wù)。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的使用方法完全相同。我們?yōu)橄M私鈨?nèi)幕和那些已經(jīng)懂得JXTA的用戶提供了一張表(http://www.onjava.com/onjava/2003/12/03/examples/table.html),在這張表中可以查詢到傳統(tǒng)TCP/IP概念上的域名,IP地址等概念和JXTA中對等概念的對應(yīng)關(guān)系。使用這種方式的好處是多方面的。首先,程序員可以將他們在標(biāo)準(zhǔn)TCP/IP Socket和Server Socket的知識應(yīng)用到JXTA peer-to-peer網(wǎng)絡(luò)當(dāng)中而不需要專門學(xué)習(xí)JXTA。其次,所有的P2P Socket 的代碼都是標(biāo)準(zhǔn)java.net中類的子類,例如java.net.Socket,所以現(xiàn)存的網(wǎng)絡(luò)應(yīng)用可以很容易的移植到peer-to-peer網(wǎng)絡(luò)當(dāng)中。 P2P Socket工程已經(jīng)將很多現(xiàn)存的軟件移植到了peer-to-peer網(wǎng)絡(luò)當(dāng)中,其中包括web服務(wù)器(Jetty),它可以接收請求,被在peer-to-peer 網(wǎng)絡(luò)上提供內(nèi)容服務(wù);一個servlet和JSP引擎(Jetty 和 Jsper),它可以使現(xiàn)存的servlet和JSP直接在P2P網(wǎng)絡(luò)中應(yīng)用;一個XML-RPC客戶端和服務(wù)器(Apache XML-RPC),它可以訪問和對外提供P2P XML-RPC 端點;一個HTTP/1.1客戶端(Apache Commons HTTP-Client),它可以訪問P2P的web 服務(wù)器;一個網(wǎng)關(guān)(Smart Cache),它可以是現(xiàn)有瀏覽器訪問P2P的P2P web 站點;和WikiWiki(JSPWiki),它能夠在你的主機(jī)上建立Wiki站點,使其他的Peer可以通過P2P網(wǎng)絡(luò)訪問,并編輯。所有的這些軟件在移植之后都能夠正常的使用并且和以前看起來完全一樣。P2P Socket的抽象非常的成功,移植這些軟件所花費的時間僅僅是30分鐘到幾個小時不等。P2P Socket工程是完全開源的,大部分都采用BSD-type證書,由于是使用Java編寫的,所以也具有跨平臺的特性。由于P2P Socket是建立在JXTA之上的,所以它可以很容易的處理一些傳統(tǒng)的ServerSocket和Socket所不能處理的情況。第一,在P2P Socket上建立的ServerSocket,具有fail-over(不知道怎么翻譯,應(yīng)該是可靠性之類的意思)和易擴(kuò)展的特性。如果不同的Peer可以啟動ServerSocket使用同一個域名和端口,例如www.nike.laborpolicy 端口號:80。當(dāng)一個客戶端打開P2P socket連接到www.nike.laborpolicy 端口號:80時,它會隨機(jī)的連接到一個提供一個使用這個域名和端口的主機(jī)上。所有的這些服務(wù)器Peer可能提供同樣的Web頁面,這就是可以將用戶的請求分布到不同的服務(wù)器之上同時也就使得某一個服務(wù)器的崩潰更容易被恢復(fù)。這一點和DNS round-robin非常的相似,在DNS round-robin當(dāng)中一個域名可以被解析為多個IP地址用來進(jìn)行負(fù)載均衡。第二,由于P2P Socket并不使用DNS系統(tǒng),主機(jī)名可以任意指定。用戶可以建立他自己的個性結(jié)尾,例如www.boobah.cat 或是www.cynthia.goddess,或是應(yīng)用確定的名字,例如一個即使消息系統(tǒng)使用Brad GNUberg或是Fidget666當(dāng)作域名。第三,一個指定域名的服務(wù)端口可以分布在全世界很多的Peer當(dāng)中。舉例來說,假設(shè)你有一個虛擬主機(jī)名www.nike.laborpolicy,一個Peer可以在80端口提供web頁面,另一個Peer可以使用2000端口提供即時消息,最后一個Peer可以在3000端口為其他Peer提供即時的RSS更新。現(xiàn)在一個域名可以由很多分布不同的Peer協(xié)同在一起提供服務(wù)。需求與配置要開發(fā)和使用P2P Socket你必須下載和安裝一下的這些軟件。●JDK 1.4+P2P Socket只能工作在JDK 1.4或是更新版本的Java虛擬機(jī)之上,由于P2P Socket是Java.net.InetAddress的子類,在1.4之前,這個類是final類型的。●Ant 1.5.3+用來構(gòu)建和運行P2P Socket以及類似于Jetty 和 Jasper之類的擴(kuò)展●P2PSockets-1.0-beta1.zipP2P Socket 的最新發(fā)布包安裝和配置好JDK和Ant,并保證它們都可以在命令行下正確運行。將P2PSockets-1.0-beta1.zip解開到硬盤上。在目錄名當(dāng)中不能出現(xiàn)空格,否則P2P Sockets的構(gòu)建文件不能正常工作。必須將JAR文件p2psockets/lib/ant-contrib-0.5.jar加入到你的CLASSPATH當(dāng)中去。在Windows當(dāng)中可以使用下面這個命令:set CLASSPATH=%CLASSPATH%;c:p2psocketslibant-contrib-0.5.jarP2P Sockets的目錄包含兩個不同的子目錄,test/clientpeer和test/serverpeer,它們中有已經(jīng)設(shè)置好的JXTA配置信息(分別在test/clientpeer/.JXTA和test/serverpeer/.JXTA當(dāng)中)。如果你想要了解更多的關(guān)于JXTA的配置問題,你可以閱讀JXTA配置指南。兩個測試peer已經(jīng)被配置為最差的情況下工作模式,也就是peer處在防火墻或是NAT設(shè)備之后,也就是說用戶必須使用其他的中間Peer來中繼它們的請求。如果用戶不處在這種環(huán)境下,這種配置方式也是可以工作的。使用JXTA的一個好處就是,當(dāng)你在使用這個系統(tǒng)的時候,它對你的程序幾乎是透明的。當(dāng)你在測試本文中的代碼的時候,你必須連接到Internet。這樣做基于一下的兩個原因:首先,例子程序使用Sun提供的公共JXTA服務(wù)器來將啟動peer引入JXTA網(wǎng)絡(luò)當(dāng)中;其次,在一些操作系統(tǒng)上(例如Windows XP, 缺省),網(wǎng)絡(luò)系統(tǒng)在你沒有連接到網(wǎng)絡(luò)上時會自動關(guān)閉,這樣就會阻礙運行在同一個主機(jī)上的客戶端peer和服務(wù)器peer互相通訊。建立一個P2P Server Socket建立一個P2P server Socket的方法和建立一個標(biāo)準(zhǔn)的java.net.ServerSocket完全一樣。// start a server socket for the domain// 'www.nike.laborpolicy' on port 100java.net.ServerSocket server = new java.net.P2PServerSocket('www.nike.laborpolicy', 100);通過上面的這種方法,我們可以建立一個server socket在域名www.nike.laborpolicy 端口100上監(jiān)聽客戶端請求。在這種情況下,P2PServerSocket的代碼將會去搜索一個名字叫做www.nike.laborpolicy的peer group。一旦它找到了這個peer group,它會加入;接著它會創(chuàng)建并發(fā)布一個JXTA peer group 的廣告消息在當(dāng)中會有一個依照特定格式的Name域。這個域使用hostname/IP address,例如 www.nike.laborpolicy/44.33.67.22這種格式。我們使用通配符來搜索基于JXTA rendezvous 服務(wù)器上的主機(jī)名或是IP地址,例如www.nike.laborpolicy/*來進(jìn)行在不知道IP地址情況下的搜索,或是采用*/44.33.67.22來進(jìn)行指定IP地址的搜索。一旦我們找到或是創(chuàng)建了這個peer group,我們就可以發(fā)布這個JXTA pipe advertisement到這個peer group當(dāng)中去,在這個廣告信息當(dāng)中使用Name字段設(shè)置端口,例如80。在建立了這個server socket以后,用戶可以像使用普通的java.net.ServerSocket一樣的使用,等待一個客戶端的請求,并獲得InputStream或是OutputStream來進(jìn)行通訊:java.net.Socket client = server.accept();// now communicate with this clientjava.io.DataInputStream in = new DataInputStream(client.getInputStream());java.io.DataOutputStream out = new DataOutputStream(client.getOutputStream());out.writeUTF('Hello client world!');String results = in.readUTF();System.out.println(results); 盡管客戶端看起來和正常的java.net.Socket很相似,但實際上它已經(jīng)是通過JXTA peer-to-peer網(wǎng)絡(luò)來進(jìn)行通訊了,請求與響應(yīng)消息都是通過其他的peer進(jìn)行中繼來穿越NAT和網(wǎng)絡(luò)區(qū)域的。當(dāng)然,這一些都是隱藏在后臺的。與普通的server socket不同,我們需要初始化并登錄進(jìn)入我們的peer-to-peer網(wǎng)絡(luò)。在我們建立P2PServerSocket之前,我們需要進(jìn)行以下的操作:// sign into the peer-to-peer network, using// the username 'serverpeer', the password 'serverpeerpassword',// and create/find a scoped peer-to-peer network named 'TestNetwork'java.net.P2PNetwork.signin('serverpeer', 'serverpeerpassword', 'TestNetwork'); 頭兩個參數(shù)是用來登錄進(jìn)入peer-to-peer網(wǎng)絡(luò)的用戶名和密碼。這是在用戶設(shè)置JXTA Configurator的時候的時候輸入的,一個Swing的對話框(在第一運行JXTA 平臺的時候會彈出)會允許你在P2P 網(wǎng)絡(luò)上配置你的Peer。在你自己的應(yīng)用當(dāng)中,你可以從命令行和GUI的方式獲取這些值。P2P Sockets 包里面預(yù)先配置好了兩個JXTA Peer分別放在test/clientpeer和test/serverpeer下面。最后的一個參數(shù)(上面例子中的TestNetwork)是你的peer-to-peer網(wǎng)絡(luò)的唯一名字。建立在P2P Sockets之上的不同peer-to-peer網(wǎng)絡(luò)可以在不知道對方存在的情況下共存。客戶端和服務(wù)器在特定的peer-to-peer網(wǎng)絡(luò)當(dāng)中創(chuàng)建和解析它們的server sockets和sockets。最后的一個參數(shù)就是你私有的,由應(yīng)用指定的peer-to-peer網(wǎng)絡(luò)。如果你創(chuàng)建了一個名叫TestNetwork的server socket而另一個用戶登錄進(jìn)入一個名叫InstantMessagingNetWork的serversocket,它們就不能找到對方并進(jìn)行通訊。接下來我們來看看P2PNetwork這個類是怎樣工作的。當(dāng)你調(diào)用signin方法的時候,網(wǎng)絡(luò)字符串(例子中的TestNetwork)將會被哈希為一個MD5的peer group ID;這樣就會保證在我們以Peer ID搜索的時候,這個應(yīng)用的名字是全局唯一的。所有的域名和IP地址解析都發(fā)生在這個應(yīng)用的peer group內(nèi)部。應(yīng)當(dāng)注意到在test/clientpeer和test/serverpeer當(dāng)中使用的JXTA配置文件都將使用Sun rendezvous服務(wù)器作為加入JXTA網(wǎng)絡(luò)的引導(dǎo)服務(wù)器;當(dāng)你想要使用其他的初始服務(wù)器時,你需要修改配置文件。對于程序員來說,你可以根據(jù)自己的應(yīng)用或是所創(chuàng)建網(wǎng)絡(luò)的類型選擇自己的網(wǎng)絡(luò)名,例如:MyApplicationsNetwork 或是 AcmeCompanyInformationNetwork。最終的代碼如下所示:import java.io.InputStream;import java.io.OutputStream;import java.io.DataOutputStream;import java.io.DataInputStream;import java.net.Socket;import java.net.ServerSocket;import java.net.P2PServerSocket;import java.net.P2PNetwork;public class ExampleServerSocket { public static void main(String args[]) { try { // sign into the peer-to-peer network, // using the username 'serverpeer', the password 'serverpeerpassword', // and create/find a scoped peer-to-peer network named 'TestNetwork' System.out.println('Signing into the P2P network...'); P2PNetwork.signin('serverpeer', 'serverpeerpassword', 'TestNetwork'); // start a server socket for the domain // 'www.nike.laborpolicy' on port 100 System.out.println('Creating server socket for ' + 'www.nike.laborpolicy:100...'); ServerSocket server = new P2PServerSocket('www.nike.laborpolicy', 100); // wait for a client System.out.println('Waiting for client...'); Socket client = server.accept(); System.out.println('Client Accepted.');// now communicate with this client DataInputStream in = new DataInputStream(client.getInputStream()); DataOutputStream out = new DataOutputStream(client.getOutputStream()); out.writeUTF('Hello client world!'); String results = in.readUTF(); System.out.println('Message from client: ' + results);// shut everything down! client.close(); server.close(); } catch (Exception e) { e.printStackTrace(); System.exit(1); } }}使用P2P Socket來連接P2P Server Socket建立和使用P2P socket連接P2P Server socket一樣容易:首先,需要登錄進(jìn)去指定的peer-to-peer網(wǎng)絡(luò)當(dāng)中:// sign into the peer-to-peer network,// using the username 'clientpeer', the password 'clientpeerpassword',// and find the peer-to-peer network named 'TestNetwork'java.net.P2PNetwork.signin('clientpeer', 'clientpeerpassword', 'TestNetwork');接下來,使用指定的主機(jī)名和端口號創(chuàng)建你想要連接的socket:java.io.DataInputStream in = new DataInputStream(socket.getInputStream());java.io.DataOutputStream out = new DataOutputStream(socket.getOutputStream());String results = in.readUTF();System.out.println(results);out.writeUTF('Hello server world!');下面是完整的代碼:import java.io.InputStream;import java.io.OutputStream;import java.io.DataOutputStream;import java.io.DataInputStream;import java.net.Socket;import java.net.P2PSocket;import java.net.P2PNetwork;public class ExampleClientSocket { public static void main(String args[]) { try { // sign into the peer-to-peer network, // using the username 'clientpeer', the password 'clientpeerpassword', // and find a network named 'TestNetwork' System.out.println('Signing into the P2P network..'); P2PNetwork.signin('clientpeer', 'clientpeerpassword', 'TestNetwork'); // create a socket to connect to the // domain 'www.nike.laborpolicy' on port 100 System.out.println('Connecting to server socket! at ' + 'www.nike.laborpolicy:100...'); Socket socket = new P2PSocket('www.nike.laborpolicy', 100); System.out.println('Connected.');// now communicate with this server DataInputStream in = new DataInputStream(socket.getInputStream()); DataOutputStream out = new DataOutputStream(socket.getOutputStream()); String results = in.readUTF(); System.out.println('Message from server: ' + results); out.writeUTF('Hello server world!');// shut everything down socket.close(); } catch (Exception e) { e.printStackTrace(); System.exit(1); } }}運行P2P Server Socket和Socket的例子打開兩個不同的Shell 窗口。在兩個窗口當(dāng)中,鍵入下面的命令來設(shè)置使用Ant構(gòu)建所需的環(huán)境變量(修改環(huán)境變量使之指向你安裝P2P sockets和JDK的位置):set p2psockets_home=c:p2psocketsset JAVA_HOME=c:j2sdk1.4.1在兩個窗口中,都進(jìn)入p2psockets的目錄,例子源碼在p2psockets/src/examples目錄下面,名字分別叫做ExampleClientSocket.java和ExampleServerSocket.java。所有的代碼都已經(jīng)編譯進(jìn)入p2psockets/dist/examples目錄當(dāng)中去,但是如果你想要重新編譯它們的時候,在其中一個shell當(dāng)中使用下面的這個命令:ant clobber build jar要運行客戶端和服務(wù)器,在一個窗口當(dāng)中鍵入下面的命令來啟動例子P2P server socket:ant example-serversocket-run你會看到如下的屏幕顯示:Buildfile: build.xmlexample-serversocket-run:Signing into the P2P network...Using the application peer group name TestNetworkWaiting for RendezVous Connection.........Finished connecting to RendezVous.Creating server socket forwww.nike.laborpolicy:100...Waiting for client...在另一個窗口當(dāng)中,輸入如下的命令啟動p2p client socket:ant example-clientsocket-run你會在client peer 的窗口當(dāng)中看到如下的輸出:Buildfile: build.xmlexample-clientsocket-run:Signing into the P2P network..Using the application peer group name TestNetworkWaiting for RendezVous Connection......Finished connecting to RendezVous.Connecting to server socket atwww.nike.laborpolicy:100...Connected.Message from server: Hello client world!在服務(wù)器窗口,你會看到如下的輸出:Buildfile: build.xmlexample-serversocket-run:Signing into the P2P network...Using the application peer group name TestNetworkWaiting for RendezVous Connection.........Finished connecting to RendezVous.Creating server socket forwww.nike.laborpolicy:100...Waiting for client...Client Accepted.Message from client: Hello server world!祝賀你,你已經(jīng)建立了一個簡單的peer-to-peer網(wǎng)絡(luò),這并沒有需要你做太多的工作,也沒有需要你在基本的Java sockets和server sockets以外的知識。如果你遇到困難,首先確保你已經(jīng)連接到互聯(lián)網(wǎng)上,是否使用Java 1.4+,確保P2P Socket package 所安裝的目錄名當(dāng)中沒有空格。也許你根據(jù)你所使用的特殊網(wǎng)絡(luò)環(huán)境調(diào)整你的JXTA網(wǎng)絡(luò)設(shè)置。如果你想要在兩個被NAT所阻塞的不同的機(jī)器上運行客戶端和服務(wù)器Socket例子,也許你是碰到了P2P Sockets所公開的一個bug。檢查一個主機(jī)名,IP地址,或是端口號是否被占用缺省情況下,P2PInetAddress和P2PServerSocket類并不會去檢查主機(jī)名,IP地址,或是端口號是否被占用。這樣做的原因是應(yīng)用的開發(fā)者可以使用獨一無二的方法來使用P2P Server Socket而傳統(tǒng)的Socket是不能這樣做的。舉例來說,不同的peer可以啟動P2P Server sockets使用同一個主機(jī)名和端口,通過這種方式來提供容錯性和擴(kuò)展性。如果我們想要在發(fā)現(xiàn)地址已經(jīng)被占用的時候拋出一個異常的話,這種可能行就被排除了。盡管如此,系統(tǒng)提供了用于發(fā)現(xiàn)主機(jī)名,IP地址或是端口號是否被占用的方法。這些是java.net.P2PNameService當(dāng)中的靜態(tài)方法。例子如下:boolean nameAvailable = P2PNameService.isHostNameTaken('www.nike.laborpolicy');boolean portAvailable = P2PNameService.isPortTaken('www.nike.laborpolicy', 80);boolean addressAvailable = P2PNameService.isIPAddressTaken('33.44.74.12');在你需要為你的server創(chuàng)建一個唯一的實例的時候可以在創(chuàng)建P2P Server socket之前調(diào)用這些方法。(請閱讀局限性和安全問題一章,在P2P的域名欺騙)你已經(jīng)了解到不少關(guān)于P2P Socket和server Socket的東西。接下來的這一章將會介紹如果使用P2P Sockets包所提供的其他與標(biāo)準(zhǔn)TCP/IP兼容的類的技術(shù)細(xì)節(jié)。你并不是一定需要了解這些內(nèi)容,但如果你了解,你可以使用這些InetAddress類,本地環(huán)回地址(127.0.0.1)或是任播地址(0.0.0.0)。如果你跨過下面的章節(jié),請確保你閱讀了文章末尾處局限性和安全問題那一章。使用P2P InetAddress 類P2P Sockets 包中包含了對于java.net.InetAddress的一個子類實現(xiàn)。下面的例子介紹了幾種不同的方法,用來創(chuàng)建一個P2PInetAddress對象。// Create an InetAddress where we know the host// name but not the IP address.// This will not search the network to find the// corresponding IP address.InetAddress inetAddr = P2PInetAddress.getByAddress('www.nike.laborpolicy', null);// Create an InetAddress where we know the IP// address but not the host name.// This will not search the network to find the// corresponding host name.InetAddress inetAddr = P2PInetAddress.getByAddress('55.32.77.34', null);// Create an InetAddress where we know both the// IP address and the host name.// No searching will occur on the networkbyte ipAddress[] = new byte[4];ipAddress[0] = 55;ipAddress[1] = 32;ipAddress[2] = 77;ipAddress[3] = 34;InetAddress inetAddr = P2PInetAddress.getByAddress('www.nike.laborpolicy', ipAddress);// Create an InetAddress object using the hostname. // The network will be searched for the corresponding IP addressInetAddress inetAddr = P2PInetAddress.getByName('www.boobah.cat');// Create an InetAddress object using the hostname. // The network will be searched for the corresponding IP addressInetAddress inetAddress[] = P2PInetAddress.getAllByName('www.boobah.cat');// Create an InetAddress object using the IP address. // The network will be searched for the corresponding host name byte ipAddress[] = new byte[4];ipAddress[0] = 55;ipAddress[1] = 32;ipAddress[2] = 77;ipAddress[3] = 34;InetAddress inetAddr = P2PInetAddress.getByAddress(ipAddress);// Get the host name and IP address for the local hostInetAddress inetAddr = P2PInetAddress.getLocalHost();一旦你創(chuàng)建了一個一個P2PInetAddress對象,你就可以像使用一個正常的InetAddress對象那樣使用它:InetAddress inetAddr = P2PInetAddress.getByName('www.boobah.cat');String hostName = inetAddr.getHostName();String ipAddressString = inetAddr.getHostAddress();byte ipAddress[] = inetAddr.getAddress();boolean isLocalhost = inetAddr.isLoopbackAddress();P2P Server sockets相比起標(biāo)準(zhǔn)的server socket來說,擁有一個有趣的問題。由于P2P sockets系統(tǒng)自己實現(xiàn)了一個簡單的DNS system,我們需要一種方法來建立一個InetAddress對象,即使此時主機(jī)名還并不存在;明確的一點是我們并不想搜索整個網(wǎng)絡(luò)來將給定的主機(jī)名解析為IP地址,反之亦然,也是由于二者可能都不存在。我們可能會使用InetAddress對象來將一個P2PServerSocket綁定到一個新的主機(jī)名和IP地址上。P2P Sockets目前重載了標(biāo)準(zhǔn)的getByAddress(String host,byte address[])方法來避免對沒有給定的信息解析。由于對于這種信息的解析是沒有意思而且是不必要的,所以這種方法在創(chuàng)建一個P2PInetAddress的對象時是值得推薦的。要檢查指定的主機(jī)名或是IP地址是否已經(jīng)被占用,可以使用P2PNameService類的方法,具體的使用方法在上一章已經(jīng)介紹過了。InetAddress對象可以再啟動P2P Sockets和Server Sockets時使用,就和使用標(biāo)準(zhǔn)的Java Sockets和server Sockets一樣:InetAddress inetAddr = P2PInetAddress.getByAddress('www.boobah.cat', null);ServerSocket server = new P2PServerSocket(inetAddr, 80);.....................InetAddress inetAddr = P2PInetAddress.getByAddress('www.boobah.cat', null);Socket server = new P2PSocket(inetAddr, 80);本地環(huán)回(127.0.0.1)地址和任播地址(0.0.0.0)P2P Sockets包提供了一個廣播地址的簡單實現(xiàn),這個地址就是0.0.0.0。在標(biāo)準(zhǔn)的TCP/IP Server Sockets使用方法當(dāng)中,對于廣播的接口是這樣介紹的“對于本機(jī)上任意一個可用的IP地址啟動server socket;不需要知道這個IP地址具體是什么。在P2P Server Sockets的環(huán)境當(dāng)中,一個主機(jī)不能是“multi-home的,也就是說,就是不能有多余一個的IP地址。取而代之的是,server socket會被指定一個自動生成的主機(jī)名,也就是它的JXTA peer名。舉例來說,如果一個peer的名字叫做BradGNUberg,這個peer被給定了一個自動生成的主機(jī)名www.BradGNUberg.peer。 缺省狀況下,前綴是“www.,后綴是“.peer。這些值目前是不能自定義的,但在未來的版本當(dāng)中會給出這種能力。我們使用自動生成的Peer名來解析廣播和環(huán)回地址:// In the following example, assume the peer's// local JXTA name is BradGNUberg.InetAddress inetAddr = P2PInetAddress.getLocalHost();ServerSocket socket = new P2PServerSocket(inetAddr, 100);// returns 'www.BradGNUberg.peer'String hostName = socket.getHostName();在這段代碼運行之前,你必須在localhost和指定端口上啟動一個P2PServerSocket。P2P Server Socket同樣提供和標(biāo)準(zhǔn)server sockets相兼容的另一種特性,盡管這個特性可能很少會被使用。標(biāo)準(zhǔn)的TCP/IP server Socket可以在不指定端口的情況下被啟動。這種情況下會啟動一個server socket使用隨機(jī)的“私有端口about 1024(不知道什么意思)。P2PSocket同樣支持了這個功能;如果你啟動一個server socket而沒有指定主機(jī)名,廣播接口,或是端口號,一個隨機(jī)的端口號會在1024和65535之間產(chǎn)生。你可以從server socket上獲得這個端口號,然后使用其他的途徑通知客戶端socket,告訴它一個私有的,隨機(jī)的端口好已經(jīng)可以使用了。局限性和安全問題P2P sockets 工程目前有一下的局限性和安全問題:●假冒主機(jī)名和IP地址的情況在peer當(dāng)中比較少見,所以現(xiàn)在還沒有一種機(jī)制用于將指定的主機(jī)名和IP地址安全的聯(lián)系到特定peer或是peer group上。●網(wǎng)絡(luò)容易收到DOS(denial-of-service)攻擊,當(dāng)一個peer在網(wǎng)絡(luò)中大量發(fā)送請求或是不斷的建立server sockets。●P2P Socket 報還沒有被綁定到JVM Security Manager architecture(JVM安全管理架構(gòu))當(dāng)中,在這個框架之中代碼會被根據(jù)安全策略放到沙箱之中。一旦一個peer被暴露在網(wǎng)絡(luò)當(dāng)中,其他的peer可以利用Java虛擬機(jī)的缺陷或是P2P Socket層本身的缺陷來危及這個peer的安全。將peer的代碼放到沙箱里面和本地機(jī)器的資源格離起來可以保護(hù)這個缺陷,但由于P2P Socket在執(zhí)行之前并不檢查安全管理,所以目前這種方法還不可行。將JSP引擎包含在標(biāo)準(zhǔn)的個人電腦上,例如JSP依賴于javac,java編譯器上同樣是很危險的。將網(wǎng)絡(luò)路徑包含在一種語言的編譯器當(dāng)中也很危險,這是一種攻擊計算機(jī)取得更高的訪問權(quán)的常用方式。你應(yīng)該預(yù)先編譯好你的JSP和servlet,并將它們綁定到你的peer程序當(dāng)中而不是提供整個的JSP引擎。●還不支持多播IP地址和多播Socket。●還不支持UDP Socket。●一些socket選項,流入SoLinger,并沒有被支持。●不支持非阻塞的I/O Socket 管道●本機(jī)的環(huán)回socket服務(wù)器被暴露給外界,這是不對的。●不支持SSL/HTTPS●JXTA的配置器在沒有JXTA配置的時候會被激活。這帶來了幾個問題。首先,這是P2P Sockets暴露給程序員JXTA概念的最后一個地方,其次,它要求用戶深入了解這個配置系統(tǒng)以查找出他是否處在防火墻或是NAT設(shè)備之后。未來的工程會自動配置這些屬性,加入一種“內(nèi)省的方法,來自我感知是否處在防火墻或是NAT設(shè)備之后。版權(quán)信息:P2P Socket,包括本文的源代碼,都受Sun Project JXTA Software License的保護(hù)。資源:●'How to Create Peer-to-Peer Web Servers, Servlets, JSPs, and XML-RPC Clients and Servers' ●P2P Sockets主頁 ●JXTA主頁 ●JXTA配置器 ●'What is a WikiWiki?' ●JDK 1.4 ●Ant 1.5.3 ●P2PSockets-1.0-beta1.zip ●Brad GNUberg的Weblog ●給Brad GNUberg發(fā)郵件 問題?評論?請查閱P2P Sockets Homepage或和作者Brad Neuberg聯(lián)系。或在太平洋標(biāo)準(zhǔn)時間,從周一到周五撥打1(510) 938-3263。或者查看他的網(wǎng)志,www.codinginparadise.org,獲得關(guān)于Mozilla,Java,JXTA和P2P的新聞。Brad Neuberg是一個開源開發(fā)者,目前居住在San Francisco Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd Peer-to-Peer Sockets 工程入門作者:Brad Neuberg譯者:gracepig [email protected]
相關(guān)文章:
主站蜘蛛池模板: 韩国自拍偷自拍亚洲精品 | 欧美性群另类交 | 亚洲黄色片网站 | 国产欧美日韩精品第三区 | 成年人看的免费视频 | 欧美成人免费午夜影视 | 日产国产精品亚洲系列 | 欧美国产在线看 | 香港全黄一级毛片在线播放 | 草草草影院| 91亚洲精品一区二区在线观看 | 免费成人高清视频 | 日本www视频在线观看 | 国产成人a一区二区 | 精品女厕沟底拍撒尿 | 91亚洲国产成人久久精品网站 | 手机在线观看亚洲国产精品 | 国产一级视频久久 | 国产成人麻豆精品 | 色久网 | 性a视频| 乱子伦一级在线现看 | 日本韩国欧美在线观看 | 88av在线视频| 日韩二区三区 | 日韩中文字幕在线看 | 毛片手机在线 | 精品中文字幕在线观看 | 亚洲三级小视频 | 成人国产一区二区三区精品 | 亚洲精品久久99久久一区 | 日日a.v拍夜夜添久久免费 | 在线精品免费观看综合 | 成年人免费看视频 | 国产精品久久久久久久久久免费 | 在线成人97观看 | 精品免费久久久久久久 | 国产亚洲精品片a77777 | 好妞操| 亚洲美女视频在线观看 | 国产孕妇孕交视频在线观看 |