數據報(Datagram)使網絡層數據單元在介質上傳輸信息的一種邏輯分組格式,它是一種在網絡中傳播的、獨立的、自身包含地址信息的消息,它能否到達目的地,到達的時間,到達時內容是否會變化不能准確知道的。
<!-- frame contents -->
<!-- /frame contents -->
它的通訊雙方是不需要建立連接的,對於一些不需要很高質量的應用程序來說,數據報通訊是一個非常好的選擇。在Java的java.net包中有兩個類DatagramSocket和DatagramPacket,為應用程序中采用數據報通訊方式進行網絡通訊。
下面,我想具體解釋在Java中實現客戶端與服務器之間數據報通訊的方法,請看:
一、
客戶端應用程序的工作流程 1) 首先要建立數據報通訊的Socket,我們可以通過創建一個DatagramSocket對象來實現它,在Java中DatagramSocket類有如下兩種構造方法:
a)public DatagramSocket() 構造一個數據報socket,並使其與本地主機任一可用的端口連接。若打不開socket則拋出SocketException異常。
b) public DatagramSocket(int port) 構造一個數據報socket,並使其與本地主機指定的端口連接。若打不開socket或socket無法與指定的端口連接則拋出SocketException異常。
2) 創建一個數據報文包,用來實現無連接的包傳送服務。每個數據報文包是用DatagramPacket類來創建,DatagramPacket對象封裝了數據報包數據,包長度,目標地址,目標端口。作為客戶端要發送數據報文包,要調用DatagramPacket類以如下形式的構造函數創建DatagramPacket對象,將要發送的數據和包文目的地址信息放入對象之中。
DatagramPacket(byte bufferedarray[],int length,InetAddress address,int port)即構造一個包長度為length的包傳送到指定主機指定端口號上的數據報文包,參數length必須小於等於bufferedarry.length
DatagramPacket類提供了四個類來獲取信息
a) public byte[] getData() 返回一個字節數組,包含收到或要發送的數據報中的數據
b) public int getLength() 返回發送或接收到的數據的長度
c) public InetAddress getAddress() 返回一個發送或接收此數據報包文的機器的IP地址
d) public int getPort() 返回發送或接收數據報的遠程主機的端口號。
3)創建完DatagramSocket和DatagramPacket對象,就可以發送數據報文包了。發送是通過調用DatagramSocket對象的send方法實現,它需要以DatagramPacket對象為參數,將剛才封裝進DatagramPacket對象中的數據組成數據報發出。
4)當然,我們也可以接收數據報文包,為了接收從服務器返回的結果數據報文包,我們需要創建一個新的DatagramPacket對象,這就需要用到DatagramPacket的另一種構造方式DatagramPacket(byte bufferedarray[],int length),即只需指明存放接收的數據報的緩沖區和長度。調用DatagramSocket對象的receive()方法來完成接收數據報的工作,此時需要將上面創建的DatagramPacket對象作為參數,該方法會一直阻塞知道收到一個數據報文包,此時DatagramPacket的緩沖區中包含的就是接收到的數據,數據報文包中也包含發送者的IP地址,發送者機器上的端口號等信息。
5)處理接收緩沖區內的數據,獲取服務結果。
6)當通訊完成後,可以使用DatagramSocket對象的close()方法來關閉數據報通訊Socket。當然,Java自己會自動關閉Socket,釋放DatagramSocket和DatagramPacket所占用的資源。但是作為一種良好的編程習慣,還是要顯示的予以關閉。進入討論組討論。
下面我給出一個簡單的利用數據報通訊的客戶端程序,它能夠完成與服務器簡單的通訊。為了直觀,我把它寫成了Applet程序,由於本文不是介紹Applet,所以我只寫了簡要的注釋,對Applet感愛好的朋友親參閱有關書籍。
import java.applet.*;
<!-- frame contents -->