Java UDP協議編程要點
Java語言是我們常使用的一種UDP協議的編輯工具。那么針對Java UDP協議的編輯過程,我們需要注意一些什么呢?下面我們就針對這方面,進行了一些必要的講解。主要是針對一些重點語句的意思以及相關內容進行了解析。
一. UDP協議定義
UDP協議的全稱是用戶數據報,在網絡中它與TCP協議一樣用于處理數據包。在OSI模型中,在第四層——傳輸層,處于IP協議的上一層。UDP有不提供數據報分組、組裝和不能對數據包的排序的缺點,也就是說,當報文發送之后,是無法得知其是否安全完整到達的。
二. 使用UDP的原因
它不屬于連接型協議,因而具有資源消耗小,處理速度快的優點,所以通常音頻、視頻和普通數據在傳送時使用UDP較多,因為它們即使偶爾丟失一兩個數據包,也不會對接收結果產生太大影響。比如我們聊天用的ICQ和OICQ就是使用的UDP協議。在選擇使用協議的時候,選擇UDP必須要謹慎。在網絡質量令人不十分滿意的環境下,UDP協議數據包丟失會比較嚴重。
三. Java UDP協議編程的相關類
1. InetAddress
用于描述和包裝一個Internet IP地址。有如下方法返回實例:
getLocalhost():返回封裝本地地址的實例。
getAllByName(String host):返回封裝Host地址的InetAddress實例數組。
getByName(String host):返回一個封裝Host地址的實例。其中,Host可以是域名或者是一個合法的IP地址。
InetAddress.getByAddress(addr):根據地址串返回InetAddress實例。
InetAddress.getByAddress(host, addr):根據主機地符串和地址串返回InetAddress實例。
2. DatagramSocket
Java UDP協議的編輯中,用于接收和發送UDP的Socket實例。該類有3個構造函數:
DatagramSocket():通常用于客戶端編程,它并沒有特定監聽的端口,僅僅使用一個臨時的。程序會讓操作系統分配一個可用的端口。
DatagramSocket(int port):創建實例,并固定監聽Port端口的報文。通常用于服務端
DatagramSocket(int port, InetAddress localAddr):這是個非常有用的構建器,當一臺機器擁有多于一個IP地址的時候,由它創建的實例僅僅接收來自LocalAddr的報文。
DatagramSocket具有的主要方法如下:
1)receive(DatagramPacket d):接收數據報文到d中。receive方法產生一個“阻塞”。“阻塞”是一個專業名詞,它會產生一個內部循環,使程序暫停在這個地方,直到一個條件觸發。#p#
2)send(DatagramPacket dp):發送報文dp到目的地。
3)setSoTimeout(int timeout):設置超時時間,單位為毫秒。
4)close():關閉DatagramSocket。在應用程序退出的時候,通常會主動釋放資源,關閉Socket,但是由于異常地退出可能造成資源無法回收。所以,應該在程序完成時,主動使用此方法關閉Socket,或在捕獲到異常拋出后關閉Socket。
3. DatagramPacket
Java UDP協議的編輯中,用于處理報文,它將Byte數組、目標地址、目標端口等數據包裝成報文或者將報文拆卸成Byte數組。應用程序在產生數據包是應該注意,TCP/IP規定數據報文大小最多包含65507個,通常主機接收548個字節,但大多數平臺能夠支持8192字節大小的報文。DatagramPacket類的構建器共有4個:
DatagramPacket(byte[] buf, int length):將數據包中Length長的數據裝進Buf數組,一般用來接收客戶端發送的數據。
DatagramPacket(byte[] buf, int offset, int length):將數據包中從Offset開始、Length長的數據裝進Buf數組。
DatagramPacket(byte[] buf, int length, InetAddress clientAddress, int clientPort):從Buf數組中,取出Length長的數據創建數據包對象,目標是clientAddress地址,clientPort端口,通常用來發送數據給客戶端。
DatagramPacket(byte[] buf, int offset, int length, InetAddress clientAddress, int clientPort):從Buf數組中,取出Offset開始的、Length長的數據創建數據包對象,目標是clientAddress地址,clientPort端口,通常用來發送數據給客戶端。
主要的方法如下:
1)getData(): 從實例中取得報文的Byte數組編碼。
2)setDate(byte[] buf):將byte數組放入要發送的報文中。