摘要:網(wǎng)絡(luò)編程技術(shù)是現(xiàn)在比較流行的軟件研發(fā)技術(shù),廣泛應(yīng)用于如斗地主,五步棋等游戲以及即時(shí)通訊之中。本文介紹在Java語言中如何進(jìn)行TCP和UDP格式的網(wǎng)絡(luò)編程,通過簡單的實(shí)例演示網(wǎng)絡(luò)編程的基本方法,旨在對網(wǎng)絡(luò)編程愛好者起到拋磚引玉的作用。
關(guān)鍵詞:數(shù)據(jù)包;TCP協(xié)議;UDP協(xié)議
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1674-7712 (2012) 10-0098-01
計(jì)算機(jī)網(wǎng)絡(luò)是計(jì)算機(jī)技術(shù)和通信技術(shù)緊密結(jié)合的產(chǎn)物,對如今社會(huì)發(fā)展有著深遠(yuǎn)的影響。網(wǎng)絡(luò)編程的目的就是指直接或間接地通過網(wǎng)絡(luò)協(xié)議與其他計(jì)算機(jī)進(jìn)行通訊。網(wǎng)絡(luò)編程中有兩個(gè)主要問題:一個(gè)是如何準(zhǔn)確地定位網(wǎng)絡(luò)上一臺或多臺主機(jī),另一個(gè)就是找到主機(jī)后如何可靠高效地進(jìn)行數(shù)據(jù)傳輸。在TCP/IP協(xié)議中IP層主要負(fù)責(zé)網(wǎng)絡(luò)主機(jī)的定位,數(shù)據(jù)傳輸?shù)穆酚?,由IP地址可以唯一地確定Internet上的一臺主機(jī)。而TCP層則提供面向應(yīng)用的可靠的或非可靠的數(shù)據(jù)傳輸機(jī)制,這是網(wǎng)絡(luò)編程的主要對象,一般不需要關(guān)心IP層是如何處理數(shù)據(jù)的。
一、TCP和UDP協(xié)議
TCP和UDP協(xié)議屬于傳輸層協(xié)議。其中TCP提供IP環(huán)境下的數(shù)據(jù)可靠傳輸,它提供的服務(wù)包括數(shù)據(jù)流傳送、可靠性、有效流控、全雙工操作和多路復(fù)用。通過面向連接、端到端和可靠的數(shù)據(jù)包發(fā)送。通俗說,它是事先為所發(fā)送的數(shù)據(jù)開辟出連接好的通道,然后再進(jìn)行數(shù)據(jù)發(fā)送;而UDP則不為IP提供可靠性、流控或差錯(cuò)恢復(fù)功能。一般來說,TCP對應(yīng)的是可靠性要求高的應(yīng)用,而UDP對應(yīng)的則是可靠性要求低、傳輸經(jīng)濟(jì)的應(yīng)用。TCP支持的應(yīng)用協(xié)議主要有:Telnet、FTP、SMTP等;UDP支持的應(yīng)用層協(xié)議主要有:NFS、SNMP、DNS、TFTP等。
二、網(wǎng)絡(luò)通信中Java的網(wǎng)絡(luò)類和接口
Java中有關(guān)網(wǎng)絡(luò)方面的功能都定義在java.net程序包中。Java所提供的網(wǎng)絡(luò)功能可大致分為三大類:
(一)URL和URLConnection:使用Socket類進(jìn)行網(wǎng)絡(luò)編程相當(dāng)麻煩。對已經(jīng)存在的協(xié)議,程序員應(yīng)當(dāng)了解它的每一段代表的含義,改而使用URL類可以很大程度上免去這些麻煩。
1.URL類
URL是類URL表示統(tǒng)一資源定位器,即指向網(wǎng)上某處資源的指針。一個(gè)URL包括協(xié)議名和主機(jī)名,有些還包括特定的端口號。
2.URLConnection類
通過URL的方法openStream(),只能從網(wǎng)絡(luò)上讀取數(shù)據(jù),如果同時(shí)還想輸出數(shù)據(jù),例如向服務(wù)器的CGI程序發(fā)送一些數(shù)據(jù),則必須先與URL建立連接,然后才能對其進(jìn)行讀寫,這時(shí)就要用到URLConnection類了。CGI是公共網(wǎng)關(guān)接口的簡稱,它是用戶瀏覽器和服務(wù)器端的應(yīng)用程序進(jìn)行連接的接口。
URLConnection類可以由兩種方式構(gòu)建:一種是通過一個(gè)URL實(shí)例openConnection()方法返回一個(gè),另一種是直接通過new URLConnection(URL ul)來創(chuàng)建。URLConnection實(shí)例不僅可以實(shí)現(xiàn)接收消息,還可以發(fā)送消息。
(二)Socket:又稱套接字,是網(wǎng)絡(luò)編程中最原始的通信方式之一。一個(gè)套接字通常包含一個(gè)IP地址和一個(gè)端口地址,后者一般對應(yīng)著某個(gè)應(yīng)用程序。因此如果要進(jìn)行Socket編程,首先要確定端口。一般來說,1024以下的端口已經(jīng)被指定為固定的服務(wù)類型,如果用戶要開發(fā)自己的交流平臺,必須使用之后的端口地址。
套接字(Socket)允許程序把網(wǎng)絡(luò)連接當(dāng)成一個(gè)流,可以向這個(gè)流寫字節(jié),也可以從這個(gè)流讀取字節(jié)。Java的Socket類提供了豐富的功能。服務(wù)器使用的一般是ServerSocket,通過連接使雙方都會(huì)產(chǎn)生一個(gè)實(shí)例,對實(shí)例進(jìn)行操作來實(shí)現(xiàn)通信。大部分工作都是在抽象類SocketImpl中定義的。
任何一個(gè)網(wǎng)絡(luò)程序都離不開連接的建立、讀寫操作、關(guān)閉,程序還分為客戶和服務(wù)器兩種類型。除了關(guān)閉操作可以簡單地使用Close()方法外,讀寫操作都不是一句話說得完的。
(三)Datagram:是一種面向無連接的通信方法。它基于UDP協(xié)議,不需要建立和釋放連接,每次通信時(shí)只要構(gòu)造一個(gè)DatagramPacket實(shí)例發(fā)送出去,對方同樣構(gòu)造一個(gè)DatagramPacket實(shí)例接收。以Datagram方式傳送數(shù)據(jù)時(shí),只是把數(shù)據(jù)的目的地記錄在數(shù)據(jù)包中,然后就直接放在網(wǎng)絡(luò)上進(jìn)行傳輸,系統(tǒng)不保證數(shù)據(jù)一定能夠安全送到,也不能確定什么時(shí)候可以送到。
三、Java實(shí)現(xiàn)加密
Java的網(wǎng)絡(luò)功能十分強(qiáng)大,還體現(xiàn)在作用它可以輕松實(shí)現(xiàn)各種加密算法。如今加密算法大致可分為兩類:對稱加密和公鑰加密。
對稱加密,發(fā)送方和接收方使用同樣的密鑰,前者用它來加密,后者則用它解密。這樣做本來是很安全的,例如3DES的密鑰為112位,這樣的組合數(shù)大約是5×1033,幾乎不可能被攻破。但是密鑰總要在雙方交換,因此交換途徑的保密性就很關(guān)鍵,使用人工固然安全卻麻煩,在網(wǎng)絡(luò)上傳輸雖方便但危險(xiǎn)。故如今網(wǎng)絡(luò)上大多使用公鑰加密方式。
公鑰加密的優(yōu)點(diǎn)在于,加密和解密的密鑰是不同的,前者稱為公鑰,后者稱為私鑰。公鑰,顧名思義,是可以公開的,一臺電腦里可能存放了很多遠(yuǎn)程通訊方提供的公鑰。
公鑰解密還可以用在數(shù)字簽名上,這時(shí)的動(dòng)作是相反的:用私鑰加密,和用公鑰解密。Java里用于實(shí)現(xiàn)這方面功能的是java.security軟件包。
綜上所述,Java網(wǎng)絡(luò)編程主要基于TCP協(xié)議和UDP協(xié)議,TCP協(xié)議提供高可靠性服務(wù),適用于一次要傳輸交換大量報(bào)文的情況,信道上傳遞的包不需要源地址和目的地址,UDP協(xié)議提供高效率服務(wù),適用于依次傳輸交換少量報(bào)文的情形,每個(gè)數(shù)據(jù)包含目的的地址和端口號,Java支持網(wǎng)絡(luò)通信的類在java.net包中。
參考文獻(xiàn):
[1]印旻.Java語言與面向?qū)ο蟪绦蛟O(shè)計(jì)[M].北京:清華大學(xué)出版社,2007
[2]朱福喜.Java語言程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2007
[3]李明才.Java語言程序設(shè)計(jì)案例教程[M].北京:中國水利水電出版社,2010,8
[4]張渝.Java語言程序設(shè)計(jì)[M].北京:北京大學(xué)出版社,2008
[5]張小波.Java程序設(shè)計(jì)教程[M].北京:冶金工業(yè)出版社,2006