Datagram通訊
在TCP/IP協議的傳輸層除了TCP協議之外還有一個UDP協議,相比而言UDP的應用不如TCP廣泛,幾個標準的應用程式層協議HTTP,FTP,SMTP…使用的都是TCP協議。但是,UDP協議可以應用在需要很強的即時互動性的場合,如網路遊戲,視頻會議等。
1,什麼是Datagram
資料報(Datagram)就跟日常生活中的郵件系統一樣,是不能保證可靠的寄到的,而面向連結的TCP就好比電話,雙方能肯定對方接受到了資訊。
TCP,可靠,傳輸大小無限制,但是需要串連建立時間,差錯控制開銷大。
UDP,不可靠,差錯控制開銷較小,傳輸大小限制在64K以下,不需要建立串連。
2,Datagram使用
包java.net中提供了兩個類DatagramSocket和DatagramPacket用來支援資料報通訊,DatagramSocket用於在程式之間建立傳送資料報的通訊串連, DatagramPacket則用來表示一個資料報。
DatagramSocket的構造方法:
DatagramSocket();
DatagramSocket(int prot);
DatagramSocket(int port, InetAddress laddr)
其中,port指明socket所使用的連接埠號碼,如果未指明連接埠號碼,則把socket串連到 本地主機上一個可用的連接埠。laddr指明一個可用的本地地址。給出連接埠號碼時要保證不發生連接埠衝突,否則會產生SocketException類例外。注 意:上述的兩個構造方法都聲明拋棄非運行時例外SocketException,程式中必須進行處理,或者捕獲、或者聲明拋棄。
用資料報方式編寫client/server程式時,無論在客戶方還是服務方,首先都要建立一個DatagramSocket對象,用來接收或發送資料報,然後使用DatagramPacket類對象作為傳輸資料的載體。
DatagramPacket的構造方法 :
DatagramPacket(byte buf[],intlength);
DatagramPacket(byte buf[], int length, InetAddressaddr, int port);
DatagramPacket(byte[] buf, int offset, int length);
DatagramPacket(byte[] buf, int offset, int length,InetAddress address, int port);
其中,buf中存放資料報資料,length為資料報中資料的長度,addr和port旨明目的地址,offset指明了資料報的位移量。
在接收資料前,應該採用上面的第一種方法產生一個DatagramPacket對象,給出接收資料的緩衝區及其長度。然後調用DatagramSocket 的方法receive()等待資料報的到來,receive()將一直等待,直到收到一個資料報為止。
DatagramPacket packet=new DatagramPacket(buf, 256);
Socket.receive (packet);
發送資料前,也要先產生一個新的DatagramPacket對象,這時要使用上面的第二種 構造方法,在給出存放發送資料的緩衝區的同時,還要給出完整的目的地址,包括IP地址和連接埠號碼。發送資料是通過DatagramSocket的方法 send()實現的,send()根據資料報的目的地址來尋徑,以傳遞資料報。
DatagramPacket packet=new DatagramPacket(buf, length,address, port);
Socket.send(packet);
在構造資料報時,要給出InetAddress類參數。類InetAddress在包java.net中定義,用來表示一個Internet地址,我們可 以通過它提供的類方法getByName()從一個表示主機名稱的字串擷取該主機的IP地址,然後再擷取相應的地址資訊。
3,用Datagram進行廣播通訊(MulticastSocket)
DatagramSocket只允許資料報發送一個目的地址,java.net包中提供了一個類MulticastSocket,允許資料報以廣播方式發送到該連接埠的所有客戶。MulticastSocket用在用戶端,監聽伺服器廣播來的資料。