用JAVA實現P2P網路通訊__JAVA
來源:互聯網
上載者:User
導讀:
摘 要:分析了P2P基本概念及其基本工作原理,探討了用JAVA實現p2p網路通訊的技術,並用一個執行個體作了進一步闡述。
關鍵詞:P2P,C/S,JAVA,XML,JDK ,TCP,UDP
一、 前言
P2P(Peer-to-Peer 端到端)模型是與C/S(客戶/伺服器)模型相對應。基於C/S的使用者間通訊需要由伺服器中轉,在C/S中的伺服器故障將導致整個網路通訊的癱瘓。。而基於P2P的使用者間通訊則是直接通訊,去掉了伺服器這一層,帶來的顯著優點是通訊時沒有單一的失敗點,一個使用者的故障不會影響整個P2P網路。本文提供了一種用JAVA實現P2P網路通訊的方法。
二、P2P通訊的關鍵技術分析
(一) 資訊的傳遞
1.P2P通訊模型
由上圖可以看出,在P2P網路中,任意兩個端點之間可實現直接通訊。在基於C/S的網路中,用戶端可以通過向伺服器註冊來實現彼此之間的定位(獲得IP和連接埠)。對於P2P網路中,是如何?彼此之間的定位和通訊,下面做一闡述。
2.獲得網路中可以通訊端點的IP和連接埠
假設有一個端點A,欲和P2P網路中其他端點通訊,在通訊之前,端點A必須首先把自己的IP和連接埠通知P2P網路中的其他每一個端點。其他每個端點收到這個資訊後,就獲得了端點A的IP和連接埠,隨後向端點A反饋自己的IP和連接埠資訊,使端點A也獲得P2P網路中每個端點的IP和連接埠。
這裡有兩個技術可以完成端點A向其他端點通知其IP和連接埠的工作,一是廣播技術,二是多播技術。
廣播技術主要在區域網路中使用,在區域網路中的每一個端點(主機)都不得不接受並處理一個廣播資料包。因此為了避免網路阻塞,路由器均限制廣播資料包的通過。所以設計基於互連網的P2P程式不適合採用廣播技術。
多播技術是一種允許一個或多個寄件者(多播源)發送單一的資料包到多個接收者(一次的,同時的)的網路技術。 多播源把資料包發送到特定多播組,而只有屬於該多播組的地址才能接收到資料包。多播可以大大的節省網路頻寬,提高了資料傳送效率。減少了主幹網出現擁塞的可能性。多播組中的端點(主機)可以是在同一個物理網路, 也可以來自不同的物理網路(如果有多播路由器的支援)。因此,多播技術是我們的選擇。
在JAVA中,發送和接收多播資訊的方法:
發送多播資訊需經曆步驟
確定發送的具體資訊內容
String msg = "Hello";
選用專門為多播指定的D類IP地址(224.0.0.1到239.255.255.255),建立一個多播組
InetAddress group = InetAddress.getByName("228.5.6.7");
使用指定的連接埠(一般選1024以上的連接埠號碼)建立多播通訊端
MulticastSocket s = new MulticastSocket(6789);
加入多播組
s.joinGroup(group);
建立一個資料報封裝多播資訊
DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),
group, 6789);
發送
s.send(hi);
接收多播資訊的步驟
開闢接收緩衝區
byte[] buf = new byte[1000];
建立接收資料報
DatagramPacket recv = new DatagramPacket(buf, buf.length);
接收
s.receive(recv);
注意:以上發送和接收程式在同一個檔案中實現,若在不同檔案中實現則應分別定義多播通訊端並加入多播組。
3.與已知IP和連接埠的端點通訊
在互連網上主要採用TCP和UDP來實現兩點之間的通訊。採用TCP可可靠傳送資訊,但花費時間較多;採用UDP可快速傳遞資訊,但不能保證可靠傳遞。
JAVA實現TCP通訊的方法
利用Socket(InetAddress addr, int port)和 Socket(String host, int port),建立用戶端通訊端,利用ServerSocket(int port)建立伺服器端通訊端,port連接埠就是伺服器監聽串連請求的連接埠,通過調用accept()返回一個最近建立的Socket對象,該Socket對象綁定了客戶程式的IP地址或連接埠號碼。通過調用Socket的 getInputStream()方法獲得輸入資料流讀傳送來的資訊,也可能通過調用Socket的 getOutputStream()方法獲得輸出資料流來發送訊息。
JAVA實現UDP通訊的方法
使用DatagramPacket(byte [] buffer, int length, InetAddress addr, int port) 確定資料包數組、數組的長度、資料包的地址和連接埠資訊。使用DatagramSocket()建立用戶端通訊端,而伺服器端則採用DatagramSocket(int port),調用send(DatagramPacket dgp)和 receive(DatagramPacket dgp)來發送和接收資料包。本文設計的程式採用UDP。
(二)資訊的表示
使用XML技術
XML是以文本資料為基礎的非常靈活的格式。在通訊過程中,傳輸的資料雖然可以根據實際需要指定任意格式。但在應用中廣泛選擇XML,原因是,XML提供了切合實際的並能清楚描述和易於讀寫的格式。編寫XML檔案和解析XML檔案的工作均容易完成。通過文字編輯器可以用100%的純ASCII文本來書寫XML檔案。XML的解析工作既可自己編程來實現,也可以採用多家公司提供的XML解析器。由於XML是一種國際標準,採用XML對於程式將來功能的擴充也可帶來很多好處。
(三) 資訊的響應
在通訊過程中,資訊的響應是至關重要的。對於即時通訊系統P2P,更看重資訊響應的速度。本文所設計的P2P通訊程式提高響應速度主要從下面兩個方面進行了處理。
1. 隊列
由於P2P網路中的端點(主機)通常要接收來自很多端點的資訊,如果程式等處理完一個資訊後,再接收新的資訊,勢必會導致某些資訊的遺漏。所以接收資訊的程式只管把接收到的資訊放入隊列緩衝,處理資訊的程式則從隊列中依次取出資訊進行處理。
2. 多線程
JAVA中的多線程技術可以使多段程式同時運行。利用多線程技術可以把使用者介面、資訊接收、資訊處理分別處理,使程式更加穩定流暢,大大提高了資訊的響應速度。
三、P2P通訊程式執行個體
(一) 功能描述
本程式是一個P2P通訊程式,使用此軟體的使用者可以建立P2P通訊網路。網路中的使用者之間可以方便地通訊。同時,此網路是動態,換句話說,使用者可以隨時加入和退出此網路。
主要功能有:
獲得P2P網路中端點(主機)的IP,並動態更新
可以向任何已知IP的端點發送文本資訊
可以接收其他端點發送的文本資訊
可以獲得某些端點退出網路的資訊
功能在使用者介面上的體現
(二) 程式架構
1. 資訊流圖
資訊流圖描述了資訊的發送和接收過程。事實上,每個端點必須同時具有發送和接收資訊的功能,因此,上圖的功能將整合在一個使用者程式中。
2. 類表
根據資訊流圖,確定相應的類實現其功能。
(二)程式流圖
四、結束語
本程式旨在構建P2P網路通訊的基本架構,故程式提供的功能較為簡單,如只能交換文本資訊,網路通訊端連接埠固定等。讀者可以在此基礎上擴充其功能,如實現檔案傳輸、動態分配連接埠等。
本文轉自
http://bbs.itren.cn/html/bbs8593.html