用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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.