亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Peer-to-Peer Sockets 工程入門

瀏覽:113日期:2024-07-19 13:55:20
內容: Peer-to-Peer Sockets 工程入門作者:Brad Neuberg譯者:gracepig zhangchi_xjtu@yahoo.com.cn版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明作者: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關鍵詞: Peer-to-Peer SocketsPeer-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.zipP2P Socket 的最新發布包安裝和配置好JDK和Ant,并保證它們都可以在命令行下正確運行。將P2PSockets-1.0-beta1.zip解開到硬盤上。在目錄名當中不能出現空格,否則P2P Sockets的構建文件不能正常工作。必須將JAR文件p2psockets/lib/ant-contrib-0.5.jar加入到你的CLASSPATH當中去。在Windows當中可以使用下面這個命令:set CLASSPATH=%CLASSPATH%;c:p2psocketslibant-contrib-0.5.jarP2P 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.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上監聽客戶端請求。在這種情況下,P2PServerSocket的代碼將會去搜索一個名字叫做www.nike.laborpolicy的peer group。一旦它找到了這個peer group,它會加入;接著它會創建并發布一個JXTA peer group 的廣告消息在當中會有一個依照特定格式的Name域。這個域使用hostname/IP address,例如 www.nike.laborpolicy/44.33.67.22這種格式。我們使用通配符來搜索基于JXTA rendezvous 服務器上的主機名或是IP地址,例如www.nike.laborpolicy/*來進行在不知道IP地址情況下的搜索,或是采用*/44.33.67.22來進行指定IP地址的搜索。一旦我們找到或是創建了這個peer group,我們就可以發布這個JXTA pipe advertisement到這個peer group當中去,在這個廣告信息當中使用Name字段設置端口,例如80。在建立了這個server socket以后,用戶可以像使用普通的java.net.ServerSocket一樣的使用,等待一個客戶端的請求,并獲得InputStream或是OutputStream來進行通訊: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很相似,但實際上它已經是通過JXTA peer-to-peer網絡來進行通訊了,請求與響應消息都是通過其他的peer進行中繼來穿越NAT和網絡區域的。當然,這一些都是隱藏在后臺的。與普通的server socket不同,我們需要初始化并登錄進入我們的peer-to-peer網絡。在我們建立P2PServerSocket之前,我們需要進行以下的操作:// 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'); 頭兩個參數是用來登錄進入peer-to-peer網絡的用戶名和密碼。這是在用戶設置JXTA Configurator的時候的時候輸入的,一個Swing的對話框(在第一運行JXTA 平臺的時候會彈出)會允許你在P2P 網絡上配置你的Peer。在你自己的應用當中,你可以從命令行和GUI的方式獲取這些值。P2P Sockets 包里面預先配置好了兩個JXTA Peer分別放在test/clientpeer和test/serverpeer下面。最后的一個參數(上面例子中的TestNetwork)是你的peer-to-peer網絡的唯一名字。建立在P2P Sockets之上的不同peer-to-peer網絡可以在不知道對方存在的情況下共存。客戶端和服務器在特定的peer-to-peer網絡當中創建和解析它們的server sockets和sockets。最后的一個參數就是你私有的,由應用指定的peer-to-peer網絡。如果你創建了一個名叫TestNetwork的server socket而另一個用戶登錄進入一個名叫InstantMessagingNetWork的serversocket,它們就不能找到對方并進行通訊。接下來我們來看看P2PNetwork這個類是怎樣工作的。當你調用signin方法的時候,網絡字符串(例子中的TestNetwork)將會被哈希為一個MD5的peer group ID;這樣就會保證在我們以Peer ID搜索的時候,這個應用的名字是全局唯一的。所有的域名和IP地址解析都發生在這個應用的peer group內部。應當注意到在test/clientpeer和test/serverpeer當中使用的JXTA配置文件都將使用Sun rendezvous服務器作為加入JXTA網絡的引導服務器;當你想要使用其他的初始服務器時,你需要修改配置文件。對于程序員來說,你可以根據自己的應用或是所創建網絡的類型選擇自己的網絡名,例如: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一樣容易:首先,需要登錄進去指定的peer-to-peer網絡當中:// 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');接下來,使用指定的主機名和端口號創建你想要連接的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 窗口。在兩個窗口當中,鍵入下面的命令來設置使用Ant構建所需的環境變量(修改環境變量使之指向你安裝P2P sockets和JDK的位置):set p2psockets_home=c:p2psocketsset JAVA_HOME=c:j2sdk1.4.1在兩個窗口中,都進入p2psockets的目錄,例子源碼在p2psockets/src/examples目錄下面,名字分別叫做ExampleClientSocket.java和ExampleServerSocket.java。所有的代碼都已經編譯進入p2psockets/dist/examples目錄當中去,但是如果你想要重新編譯它們的時候,在其中一個shell當中使用下面的這個命令:ant clobber build jar要運行客戶端和服務器,在一個窗口當中鍵入下面的命令來啟動例子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...在另一個窗口當中,輸入如下的命令啟動p2p client socket:ant example-clientsocket-run你會在client peer 的窗口當中看到如下的輸出: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!在服務器窗口,你會看到如下的輸出: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!祝賀你,你已經建立了一個簡單的peer-to-peer網絡,這并沒有需要你做太多的工作,也沒有需要你在基本的Java sockets和server sockets以外的知識。如果你遇到困難,首先確保你已經連接到互聯網上,是否使用Java 1.4+,確保P2P Socket package 所安裝的目錄名當中沒有空格。也許你根據你所使用的特殊網絡環境調整你的JXTA網絡設置。如果你想要在兩個被NAT所阻塞的不同的機器上運行客戶端和服務器Socket例子,也許你是碰到了P2P Sockets所公開的一個bug。檢查一個主機名,IP地址,或是端口號是否被占用缺省情況下,P2PInetAddress和P2PServerSocket類并不會去檢查主機名,IP地址,或是端口號是否被占用。這樣做的原因是應用的開發者可以使用獨一無二的方法來使用P2P Server Socket而傳統的Socket是不能這樣做的。舉例來說,不同的peer可以啟動P2P Server sockets使用同一個主機名和端口,通過這種方式來提供容錯性和擴展性。如果我們想要在發現地址已經被占用的時候拋出一個異常的話,這種可能行就被排除了。盡管如此,系統提供了用于發現主機名,IP地址或是端口號是否被占用的方法。這些是java.net.P2PNameService當中的靜態方法。例子如下:boolean nameAvailable = P2PNameService.isHostNameTaken('www.nike.laborpolicy');boolean portAvailable = P2PNameService.isPortTaken('www.nike.laborpolicy', 80);boolean addressAvailable = P2PNameService.isIPAddressTaken('33.44.74.12');在你需要為你的server創建一個唯一的實例的時候可以在創建P2P Server socket之前調用這些方法。(請閱讀局限性和安全問題一章,在P2P的域名欺騙)你已經了解到不少關于P2P Socket和server Socket的東西。接下來的這一章將會介紹如果使用P2P Sockets包所提供的其他與標準TCP/IP兼容的類的技術細節。你并不是一定需要了解這些內容,但如果你了解,你可以使用這些InetAddress類,本地環回地址(127.0.0.1)或是任播地址(0.0.0.0)。如果你跨過下面的章節,請確保你閱讀了文章末尾處局限性和安全問題那一章。使用P2P InetAddress 類P2P Sockets 包中包含了對于java.net.InetAddress的一個子類實現。下面的例子介紹了幾種不同的方法,用來創建一個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();一旦你創建了一個一個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相比起標準的server socket來說,擁有一個有趣的問題。由于P2P sockets系統自己實現了一個簡單的DNS system,我們需要一種方法來建立一個InetAddress對象,即使此時主機名還并不存在;明確的一點是我們并不想搜索整個網絡來將給定的主機名解析為IP地址,反之亦然,也是由于二者可能都不存在。我們可能會使用InetAddress對象來將一個P2PServerSocket綁定到一個新的主機名和IP地址上。P2P Sockets目前重載了標準的getByAddress(String host,byte address[])方法來避免對沒有給定的信息解析。由于對于這種信息的解析是沒有意思而且是不必要的,所以這種方法在創建一個P2PInetAddress的對象時是值得推薦的。要檢查指定的主機名或是IP地址是否已經被占用,可以使用P2PNameService類的方法,具體的使用方法在上一章已經介紹過了。InetAddress對象可以再啟動P2P Sockets和Server Sockets時使用,就和使用標準的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);本地環回(127.0.0.1)地址和任播地址(0.0.0.0)P2P Sockets包提供了一個廣播地址的簡單實現,這個地址就是0.0.0.0。在標準的TCP/IP Server Sockets使用方法當中,對于廣播的接口是這樣介紹的“對于本機上任意一個可用的IP地址啟動server socket;不需要知道這個IP地址具體是什么。在P2P Server Sockets的環境當中,一個主機不能是“multi-home的,也就是說,就是不能有多余一個的IP地址。取而代之的是,server socket會被指定一個自動生成的主機名,也就是它的JXTA peer名。舉例來說,如果一個peer的名字叫做BradGNUberg,這個peer被給定了一個自動生成的主機名www.BradGNUberg.peer。 缺省狀況下,前綴是“www.,后綴是“.peer。這些值目前是不能自定義的,但在未來的版本當中會給出這種能力。我們使用自動生成的Peer名來解析廣播和環回地址:// 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同樣提供和標準server sockets相兼容的另一種特性,盡管這個特性可能很少會被使用。標準的TCP/IP server Socket可以在不指定端口的情況下被啟動。這種情況下會啟動一個server socket使用隨機的“私有端口about 1024(不知道什么意思)。P2PSocket同樣支持了這個功能;如果你啟動一個server socket而沒有指定主機名,廣播接口,或是端口號,一個隨機的端口號會在1024和65535之間產生。你可以從server socket上獲得這個端口號,然后使用其他的途徑通知客戶端socket,告訴它一個私有的,隨機的端口好已經可以使用了。局限性和安全問題P2P sockets 工程目前有一下的局限性和安全問題:●假冒主機名和IP地址的情況在peer當中比較少見,所以現在還沒有一種機制用于將指定的主機名和IP地址安全的聯系到特定peer或是peer group上。●網絡容易收到DOS(denial-of-service)攻擊,當一個peer在網絡中大量發送請求或是不斷的建立server sockets。●P2P Socket 報還沒有被綁定到JVM Security Manager architecture(JVM安全管理架構)當中,在這個框架之中代碼會被根據安全策略放到沙箱之中。一旦一個peer被暴露在網絡當中,其他的peer可以利用Java虛擬機的缺陷或是P2P Socket層本身的缺陷來危及這個peer的安全。將peer的代碼放到沙箱里面和本地機器的資源格離起來可以保護這個缺陷,但由于P2P Socket在執行之前并不檢查安全管理,所以目前這種方法還不可行。將JSP引擎包含在標準的個人電腦上,例如JSP依賴于javac,java編譯器上同樣是很危險的。將網絡路徑包含在一種語言的編譯器當中也很危險,這是一種攻擊計算機取得更高的訪問權的常用方式。你應該預先編譯好你的JSP和servlet,并將它們綁定到你的peer程序當中而不是提供整個的JSP引擎。●還不支持多播IP地址和多播Socket。●還不支持UDP Socket。●一些socket選項,流入SoLinger,并沒有被支持。●不支持非阻塞的I/O Socket 管道●本機的環回socket服務器被暴露給外界,這是不對的。●不支持SSL/HTTPS●JXTA的配置器在沒有JXTA配置的時候會被激活。這帶來了幾個問題。首先,這是P2P Sockets暴露給程序員JXTA概念的最后一個地方,其次,它要求用戶深入了解這個配置系統以查找出他是否處在防火墻或是NAT設備之后。未來的工程會自動配置這些屬性,加入一種“內省的方法,來自我感知是否處在防火墻或是NAT設備之后。版權信息:P2P Socket,包括本文的源代碼,都受Sun Project JXTA Software License的保護。資源:●'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發郵件 問題?評論?請查閱P2P Sockets Homepage或和作者Brad Neuberg聯系。或在太平洋標準時間,從周一到周五撥打1(510) 938-3263。或者查看他的網志,www.codinginparadise.org,獲得關于Mozilla,Java,JXTA和P2P的新聞。Brad Neuberg是一個開源開發者,目前居住在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 zhangchi_xjtu@yahoo.com.cn
相關文章:
主站蜘蛛池模板: 亚洲欧美日韩综合在线一区二区三区 | 亚洲综合图区 | 成人国产激情福利久久精品 | 8x成人在线 | 美女扒开胸罩露出奶了无遮挡免费 | 国产青青视频 | 日韩国产欧美精品综合二区 | 亚洲欧美日韩综合在线播放 | 亚洲一二区 | 成人在线不卡视频 | 欧美日韩国产精品综合 | 日本护士a做爰免费观看 | 国产高清在线精品一区αpp | 久久一区二区三区四区 | 国产免费小视频 | 亚洲国产系列 | 日本一级特大毛片 | 国产极品美女网站在线观看 | 一级片一区 | 欧美高清国产在线观看 | 国产一级做a爰片在线 | 国产免费观看视频 | 这里只有精品99re在线 | 精品中文字幕制服中文 | 国产精品一区二区不卡的视频 | 香蕉视频在线观看免费国产婷婷 | 国产成年女一区二区三区 | 六月丁香婷婷天天在线 | 久久福利青草狠狠午夜 | 亚洲国产日韩在线观看 | 久久久久久久九九九九 | 日本国产最新一区二区三区 | 国内精品久久久久久久久 | a级亚洲片精品久久久久久久 | 中国一级特黄高清免费的大片 | 在线观看免费视频网站色 | 国产成人综合网 | 在线视频中文字幕乱人伦 | 特黄特级毛片免费视 | 欧美影视一区二区三区 | 欧美一区二区三区不卡视频 |