UDP數(shù)據(jù)廣播的Java設(shè)計(jì)流程
UDP協(xié)議是一個(gè)非常實(shí)用的協(xié)議。但是它也有著一個(gè)不好的缺點(diǎn),就是不安全。但是,對于一些數(shù)據(jù)的處理,它還是非常優(yōu)秀的。那么我們就來討論一下UDP數(shù)據(jù)廣播的相關(guān)設(shè)計(jì)內(nèi)容吧。本文介紹了網(wǎng)絡(luò)通訊中通用的傳輸控制協(xié)議(TCP)和用戶數(shù)據(jù)包協(xié)議(UDP),并且利用Java語言設(shè)計(jì)了一個(gè)簡單的基于UDP數(shù)據(jù)廣播的局域網(wǎng)絡(luò)會(huì)議程序,展示了 在Java語言中進(jìn)行UDP數(shù)據(jù)發(fā)送和接收的一般步驟。由于Java語言卓越的跨平臺(tái)特性,本系統(tǒng)能夠不加修改的運(yùn)行在Windows, Linux, Mac OS等一系列不同平臺(tái)上。
隨著網(wǎng)絡(luò)技術(shù)的普及,網(wǎng)絡(luò)會(huì)議在公司、企業(yè)和單位中的應(yīng)用也越來越廣。一個(gè)網(wǎng)絡(luò)會(huì)議系統(tǒng)通常包括一個(gè)服務(wù)器程序和一個(gè)客戶端程序。其中服務(wù)器端負(fù)責(zé)進(jìn)行用戶管理、信息交互以及表決統(tǒng)計(jì);客戶端則實(shí)現(xiàn)收聽發(fā)言,公開發(fā)言,私下討論、投票表決等功能。在一個(gè)網(wǎng)絡(luò)會(huì)議系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)中,通常涉及到圖形用戶界面設(shè)計(jì),TCP/IP連接,UDP數(shù)據(jù)廣播,多線程等一系列技術(shù)。本文通過一個(gè)簡單示例程序,展示了在Java語言中進(jìn)行UDP數(shù)據(jù)發(fā)送和接收的一般步驟以及UDP數(shù)據(jù) 廣播在局域網(wǎng)絡(luò)會(huì)議系統(tǒng)中的作用。
TCP(Transmission Control Protocol,傳輸控制協(xié)議) 是一種基于連接的通訊協(xié)議。當(dāng)兩臺(tái)計(jì)算機(jī)之間需要進(jìn)行可靠的數(shù)據(jù)傳輸時(shí),它們通過網(wǎng)絡(luò)建立起一個(gè)穩(wěn)定的連接,這種連接通常也被稱為數(shù)據(jù)鏈。與電話網(wǎng)絡(luò)相類似,這種數(shù)據(jù)鏈?zhǔn)屈c(diǎn)對點(diǎn)的,通訊的雙方則通過這條數(shù)據(jù)鏈來回傳輸數(shù)據(jù)。在這條穩(wěn)定的數(shù)據(jù)鏈的基礎(chǔ)上,TCP協(xié)議通過信息校驗(yàn)?zāi)軌虮WC接收方所接收到的數(shù)據(jù)和發(fā)送方所發(fā)送的數(shù)據(jù)在內(nèi)容和順序上是完全一致的,從而實(shí)現(xiàn)了數(shù)據(jù)的可靠傳輸。
UDP(User Datagram Protocol,用戶數(shù)據(jù)包協(xié)議)與TCP協(xié)議之間的不同在于 UDP不是一種基于穩(wěn)定連接的通訊協(xié)議。UDP協(xié)議將獨(dú)立的數(shù)據(jù)包從一臺(tái)計(jì)算機(jī)傳輸?shù)搅硗庖慌_(tái)計(jì)算機(jī),但是并不保證接受方能夠接收到該數(shù)據(jù)包,也不保證接收方所接收到的數(shù)據(jù)和發(fā)送方所發(fā)送的數(shù)據(jù)在內(nèi)容和順序上是完全一致的。因此,UDP協(xié)議更類似于普通郵政服務(wù),寄信人不能夠保證所寄出去的信能夠被收信人及時(shí)收到,后發(fā)出的信也許會(huì)比先發(fā)出的信更早到達(dá)。 對于很多應(yīng)用程序來說,在互相通訊的兩臺(tái)計(jì)算機(jī)之間保證一個(gè)可靠與穩(wěn)定的數(shù)據(jù)鏈?zhǔn)侵陵P(guān)重要的。在這種情況下,就應(yīng)該首先考慮使用TCP協(xié)議在涼臺(tái)計(jì)算機(jī) 之間建立起TCP/IP連接。在HTTP (Hyper-Text Transfer Protocol,超級文本傳輸 協(xié)議)、FTP (File Transfer Protocol,文件傳輸協(xié)議)以及TELNET 應(yīng)用程序中,均要求在通訊的雙方之間建立起穩(wěn)定可靠的數(shù)據(jù)鏈,因此它們都使用了TCP協(xié)議來 進(jìn)行數(shù)據(jù)傳輸。
在TCP協(xié)議中,發(fā)送方和接收方必須交換額外的信息以保證接收方已經(jīng)接收到所發(fā)送的數(shù)據(jù)包并且所接收到的數(shù)據(jù)和發(fā)送方所發(fā)送的數(shù)據(jù)在內(nèi)容和順序上是完全一致的。這些額外的信息交換提高了數(shù)據(jù)傳輸?shù)目煽慷?,但是也給網(wǎng)絡(luò)帶來了額外的負(fù)擔(dān),導(dǎo)致數(shù)據(jù)交換的延遲,從而降低了整個(gè)網(wǎng)絡(luò)的數(shù)據(jù)交換能力。對于某些對實(shí)時(shí)性要求較高的應(yīng)用程序來說,這樣的延遲有可能是不可接受的。例如一個(gè)毫秒級的時(shí)鐘服務(wù)器按照一定的頻率向客戶機(jī)提供當(dāng)時(shí)的時(shí)間數(shù)據(jù),如果這些時(shí)間數(shù)據(jù)在傳輸過程中受到了較大的延遲,這些過時(shí)的時(shí)間數(shù)據(jù)是完全沒有意義的,即使客戶機(jī)準(zhǔn)確無誤的接收到了這些數(shù)據(jù)。相反,如果客戶機(jī)所接收到的每一個(gè)數(shù)據(jù)包都是實(shí)時(shí)的,那么即使客戶機(jī)錯(cuò)過了一兩個(gè)數(shù)據(jù)包也是可以接受的,因?yàn)樗偸强梢愿鶕?jù)后面所接收到的數(shù)據(jù)包來對自己進(jìn)行校正。因此,對于對實(shí)時(shí)性要求比較高但是對傳輸可靠度要求比較低的應(yīng)用程序來說,UDP協(xié)議顯然是一個(gè)合適的選擇。
在通用的以太網(wǎng)(Ehternet)構(gòu)架下,計(jì)算機(jī)于計(jì)算機(jī)之間的數(shù)據(jù)交換都是通過交換機(jī)來完成的。如果一份數(shù)據(jù)需要被傳送給多個(gè)接收者,在使用TCP/IP連接的情況下,數(shù)據(jù)發(fā)送者需要向交換機(jī)發(fā)送N 個(gè)同樣的拷貝,而交換機(jī)則負(fù)責(zé)將這N 個(gè)拷 貝分發(fā)給所有的接收者;在使用UDP數(shù)據(jù)廣播的情況下,數(shù)據(jù)發(fā)送者只需要向交換機(jī)發(fā)送一個(gè)拷貝,交換機(jī)負(fù)責(zé)將這個(gè)信息制作N 個(gè)拷貝發(fā)送給所有的機(jī)器。在這種情況下,使用TCP/IP連接會(huì)大大的增加網(wǎng)絡(luò)的負(fù)擔(dān)。在一個(gè)普通局域網(wǎng)絡(luò)中,可以認(rèn)為由于網(wǎng)絡(luò)狀況較差而造成數(shù)據(jù)丟失的可能性比較小,而利用UDP數(shù)據(jù)廣播進(jìn)行 數(shù)據(jù)交換能夠大幅度減輕網(wǎng)絡(luò)的負(fù)擔(dān),因此設(shè)計(jì)一個(gè)基于UDP數(shù)據(jù)廣播的局域網(wǎng)絡(luò) 會(huì)議系統(tǒng)式完全可行的。
通常來說,一臺(tái)計(jì)算機(jī)只有一個(gè)物理界面與網(wǎng)絡(luò)相連接,所有的應(yīng)用程序均通過該物理界面從網(wǎng)絡(luò)接收數(shù)據(jù)或者將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)。由于一個(gè)網(wǎng)絡(luò)上同時(shí)存在多臺(tái)計(jì)算機(jī),并且一臺(tái)計(jì)算機(jī)上有可能同時(shí)存在多個(gè)應(yīng)用程序需要與網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)交換,我們通常使用IP和端口號來識別需要進(jìn)行數(shù)據(jù)交換的計(jì)算機(jī)和應(yīng)用程序。每臺(tái)計(jì)算機(jī)由一個(gè)32位的IP地址來識別,在一個(gè)網(wǎng)絡(luò)中,每臺(tái)計(jì)算機(jī)的IP地址都是唯一的,因此應(yīng)用程序能夠根據(jù)IP地址來將數(shù)據(jù)發(fā)送到正確的計(jì)算機(jī)。每個(gè)需要與網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)交換的應(yīng)用程序均被系統(tǒng)分配一個(gè)16位的端口號,系統(tǒng)根據(jù)這個(gè)端口號將從網(wǎng)絡(luò)接收到的數(shù)據(jù)轉(zhuǎn)發(fā)給相對應(yīng)的應(yīng)用程序。端口號的范圍是從0 到65535 ,其 中從0 到1023被系統(tǒng)所保留,主要是用來提供HTTP, FTP 以及TELNET等系統(tǒng)服務(wù),因此用戶自己的應(yīng)用程序不應(yīng)該試圖去使用小于1023的端口。
Java語言的一個(gè)顯著優(yōu)點(diǎn)就是它從語言的高度上提供了對網(wǎng)絡(luò)的支持,使得程序員能夠很容易的構(gòu)建基于網(wǎng)絡(luò)的應(yīng)用程序。在Java 1.3版的標(biāo)準(zhǔn)類庫java.net中 提供了5 個(gè)接口以及21個(gè)Java類,在這些接口和類的基礎(chǔ)上,程序員能夠輕易的實(shí)現(xiàn)幾乎是所有的常見網(wǎng)絡(luò)應(yīng)用。例如,ServerSocket能夠用來構(gòu)建基于TCP/IP的服務(wù)器程序,Socket能夠用來構(gòu)建基于TCP/IP的客戶端程序,而DatagramPacket以及 DatagramSocket能夠用來構(gòu)建基于UDP的數(shù)據(jù)廣播程序。在java.net中的其他Java 庫能夠被用來實(shí)現(xiàn)域名解析、身份認(rèn)證、安全許可等一系列功能。由于這些Java庫的功能和具體用法等內(nèi)容已經(jīng)超出了本文的討論范圍,感興趣的讀者可以進(jìn)一步參考Java的文檔以及Sun 公司的Java Tutorial等資料。
這個(gè)簡單的程序包括如下三個(gè)模塊:
數(shù)據(jù)廣播與接收模塊-- Broadcast.java
數(shù)據(jù)接收線程 -- Receiver.java
圖形用戶界面 -- Chat.java
轉(zhuǎn)載地址:http://www.voipchina.cn/technology/2004-03-24/36859.shtml