久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

java實(shí)現(xiàn)P2P通信

 筑心wup 2013-06-02
摘 要:分析了P2P基本概念及其基本工作原理,,探討了用JAVA實(shí)現(xiàn)p2p網(wǎng)絡(luò)通信的技術(shù),,并用一個實(shí)例作了進(jìn)一步闡述。
    關(guān)鍵詞:P2P,,C/S,,JAVA,XML,,JDK ,,TCP,UDP

一,、 前言   
     P2P(Peer-to-Peer 端到端)模型是與C/S(客戶/服務(wù)器)模型相對應(yīng),。基于C/S的用戶間通信需要由服務(wù)器中轉(zhuǎn),,在C/S中的服務(wù)器故障將導(dǎo)致整個網(wǎng)絡(luò)通信的癱瘓,。。而基于P2P的用戶間通信則是直接通信,,去掉了服務(wù)器這一層,,帶來的顯著優(yōu)點(diǎn)是通信時(shí)沒有單一的失敗點(diǎn),一個用戶的故障不會影響整個P2P網(wǎng)絡(luò),。本文提供了一種用JAVA實(shí)現(xiàn)P2P網(wǎng)絡(luò)通信的方法,。   

二、P2P通信的關(guān)鍵技術(shù)分析
   (一) 信息的傳遞
1.P2P通信模型

按此在新窗口瀏覽圖片
由上圖可以看出,,在P2P網(wǎng)絡(luò)中,,任意兩個端點(diǎn)之間可實(shí)現(xiàn)直接通信。在基于C/S的網(wǎng)絡(luò)中,,客戶端可以通過向服務(wù)器注冊來實(shí)現(xiàn)彼此之間的定位(獲得IP和端口),。對于P2P網(wǎng)絡(luò)中,是如何實(shí)現(xiàn)彼此之間的定位和通信,,下面做一闡述,。
2.獲得網(wǎng)絡(luò)中可以通信端點(diǎn)的IP和端口
假設(shè)有一個端點(diǎn)A,,欲和P2P網(wǎng)絡(luò)中其他端點(diǎn)通信,在通信之前,,端點(diǎn)A必須首先把自己的IP和端口通知P2P網(wǎng)絡(luò)中的其他每一個端點(diǎn),。其他每個端點(diǎn)收到這個信息后,就獲得了端點(diǎn)A的IP和端口,,隨后向端點(diǎn)A反饋?zhàn)约旱腎P和端口信息,,使端點(diǎn)A也獲得P2P網(wǎng)絡(luò)中每個端點(diǎn)的IP和端口,。
這里有兩個技術(shù)可以完成端點(diǎn)A向其他端點(diǎn)通知其IP和端口的工作,,一是廣播技術(shù),二是多播技術(shù),。
廣播技術(shù)主要在局域網(wǎng)中使用,,在局域網(wǎng)中的每一個端點(diǎn)(主機(jī))都不得不接受并處理一個廣播數(shù)據(jù)包。因此為了避免網(wǎng)絡(luò)阻塞,,路由器均限制廣播數(shù)據(jù)包的通過,。所以設(shè)計(jì)基于互聯(lián)網(wǎng)的P2P程序不適合采用廣播技術(shù)。
多播技術(shù)是一種允許一個或多個發(fā)送者(多播源)發(fā)送單一的數(shù)據(jù)包到多個接收者(一次的,,同時(shí)的)的網(wǎng)絡(luò)技術(shù),。 多播源把數(shù)據(jù)包發(fā)送到特定多播組,而只有屬于該多播組的地址才能接收到數(shù)據(jù)包,。多播可以大大的節(jié)省網(wǎng)絡(luò)帶寬,,提高了數(shù)據(jù)傳送效率。減少了主干網(wǎng)出現(xiàn)擁塞的可能性,。多播組中的端點(diǎn)(主機(jī))可以是在同一個物理網(wǎng)絡(luò),, 也可以來自不同的物理網(wǎng)絡(luò)(如果有多播路由器的支持)。因此,,多播技術(shù)是我們的選擇,。
在JAVA中,發(fā)送和接收多播信息的方法:
發(fā)送多播信息需經(jīng)歷步驟
確定發(fā)送的具體信息內(nèi)容 
String msg = "Hello";
選用專門為多播指定的D類IP地址(224.0.0.1到239.255.255.255),,創(chuàng)建一個多播組
InetAddress group = InetAddress.getByName("228.5.6.7");
使用指定的端口(一般選1024以上的端口號)建立多播套接字
MulticastSocket s = new MulticastSocket(6789);
加入多播組
s.joinGroup(group);
創(chuàng)建一個數(shù)據(jù)報(bào)封裝多播信息
DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),
group, 6789);
發(fā)送
s.send(hi);
接收多播信息的步驟
開辟接收緩沖區(qū)
byte[] buf = new byte[1000];
創(chuàng)建接收數(shù)據(jù)報(bào)
DatagramPacket recv = new DatagramPacket(buf, buf.length);
接收
s.receive(recv);
注意:以上發(fā)送和接收程序在同一個文件中實(shí)現(xiàn),若在不同文件中實(shí)現(xiàn)則應(yīng)分別定義多播套接字并加入多播組,。 
3.與已知IP和端口的端點(diǎn)通信
在互聯(lián)網(wǎng)上主要采用TCP和UDP來實(shí)現(xiàn)兩點(diǎn)之間的通信。采用TCP可可靠傳送信息,,但花費(fèi)時(shí)間較多,;采用UDP可快速傳遞信息,但不能保證可靠傳遞,。
JAVA實(shí)現(xiàn)TCP通信的方法
利用Socket(InetAddress addr, int port)和 Socket(String host, int port),,創(chuàng)建客戶端套接字,利用ServerSocket(int port)創(chuàng)建服務(wù)器端套接字,,port端口就是服務(wù)器監(jiān)聽連接請求的端口,,通過調(diào)用accept()返回一個最近創(chuàng)建的Socket對象,,該Socket對象綁定了客戶程序的IP地址或端口號。通過調(diào)用Socket的 getInputStream()方法獲得輸入流讀傳送來的信息,,也可能通過調(diào)用Socket的 getOutputStream()方法獲得輸出流來發(fā)送消息,。
JAVA實(shí)現(xiàn)UDP通信的方法
使用DatagramPacket(byte [] buffer, int length, InetAddress addr, int port) 確定數(shù)據(jù)包數(shù)組、數(shù)組的長度,、數(shù)據(jù)包的地址和端口信息,。使用DatagramSocket()創(chuàng)建客戶端套接字,而服務(wù)器端則采用DatagramSocket(int port),,調(diào)用send(DatagramPacket dgp)和 receive(DatagramPacket dgp)來發(fā)送和接收數(shù)據(jù)包,。本文設(shè)計(jì)的程序采用UDP。
(二)信息的表示
使用XML技術(shù)
XML是以文本數(shù)據(jù)為基礎(chǔ)的非常靈活的格式,。在通信過程中,,傳輸?shù)臄?shù)據(jù)雖然可以根據(jù)實(shí)際需要指定任意格式。但在應(yīng)用中廣泛選擇XML,,原因是,,XML提供了切合實(shí)際的并能清楚描述和易于讀寫的格式。編寫XML文件和解析XML文件的工作均容易完成,。通過文本編輯器可以用100%的純ASCII文本來書寫XML文件,。XML的解析工作既可自己編程來實(shí)現(xiàn),也可以采用多家公司提供的XML解析器,。由于XML是一種國際標(biāo)準(zhǔn),,采用XML對于程序?qū)砉δ艿臄U(kuò)展也可帶來很多好處。
(三) 信息的響應(yīng)
在通信過程中,,信息的響應(yīng)是至關(guān)重要的,。對于實(shí)時(shí)通信系統(tǒng)P2P,更看重信息響應(yīng)的速度,。本文所設(shè)計(jì)的P2P通信程序提高響應(yīng)速度主要從下面兩個方面進(jìn)行了處理,。
1. 隊(duì)列
由于P2P網(wǎng)絡(luò)中的端點(diǎn)(主機(jī))通常要接收來自很多端點(diǎn)的信息,如果程序等處理完一個信息后,,再接收新的信息,,勢必會導(dǎo)致某些信息的遺漏。所以接收信息的程序只管把接收到的信息放入隊(duì)列緩沖,,處理信息的程序則從隊(duì)列中依次取出信息進(jìn)行處理,。
2. 多線程
JAVA中的多線程技術(shù)可以使多段程序同時(shí)運(yùn)行。利用多線程技術(shù)可以把用戶界面,、信息接收,、信息處理分別處理,使程序更加穩(wěn)定流暢,,大大提高了信息的響應(yīng)速度,。

三,、P2P通信程序?qū)嵗?/b>
    (一) 功能描述
本程序是一個P2P通信程序,使用此軟件的用戶可以建立P2P通信網(wǎng)絡(luò),。網(wǎng)絡(luò)中的用戶之間可以方便地通信,。同時(shí),此網(wǎng)絡(luò)是動態(tài)的,,換句話說,,用戶可以隨時(shí)加入和退出此網(wǎng)絡(luò)。
主要功能有:
獲得P2P網(wǎng)絡(luò)中端點(diǎn)(主機(jī))的IP,,并動態(tài)更新
可以向任何已知IP的端點(diǎn)發(fā)送文本信息
可以接收其他端點(diǎn)發(fā)送的文本信息
可以獲得某些端點(diǎn)退出網(wǎng)絡(luò)的信息

功能在用戶界面上的體現(xiàn)

按此在新窗口瀏覽圖片

(二) 程序框架
1. 信息流圖
按此在新窗口瀏覽圖片

信息流圖描述了信息的發(fā)送和接收過程,。事實(shí)上,每個端點(diǎn)必須同時(shí)具有發(fā)送和接收信息的功能,,因此,,上圖的功能將集成在一個用戶程序中,。

2. 類表
根據(jù)信息流圖,,確定相應(yīng)的類實(shí)現(xiàn)其功能。

按此在新窗口瀏覽圖片

(二)程序流圖

按此在新窗口瀏覽圖片
按此在新窗口瀏覽圖片

四,、結(jié)束語
    本程序旨在構(gòu)建P2P網(wǎng)絡(luò)通信的基本框架,,故程序提供的功能較為簡單,如只能交換文本信息,,網(wǎng)絡(luò)套接字端口固定等,。讀者可以在此基礎(chǔ)上擴(kuò)展其功能,如實(shí)現(xiàn)文件傳輸,、動態(tài)分配端口等,。
本程序在WIN98,JDK1.4.1,,局域網(wǎng)環(huán)境下調(diào)試成功,。若在互聯(lián)網(wǎng)上運(yùn)行需要支持多播的路由器的支持。
參考文獻(xiàn):
1. 《Think in Java》
2. Java 2 SDK, Standard Edition Documentation version 1.4.1
3. 《無廢話XML》

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多