JAVA套接字之UDP程式設計
阿新 • • 發佈:2019-02-12
1 UDP協議
使用者資料報協議UDP是無連線的服務。在無連線的情況下,兩個實體之間的通訊不需要建立好一個連線,因此其下層的有關資源不需要事先進行預訂的保留。這些資源在資料傳輸時動態的進行分配。
無連線服務的另一個特徵就是他不需要通訊的兩個實體同時是活躍的(即處於啟用狀態)。當傳送端的實體正在進行傳送時,它才是活躍的。
無連線服務的優點就是靈活方便並且比較迅速。但是無連線服務不能防止報文的丟失、重複或失序。無連線服務特別適合傳輸少量零星的報文。
在java中操縱UDP使用JDK中java.net包下的DatagramSocket和DatagramPacket類,可以方便的控制使用者資料報文。DatagramPacket類將資料位元組填充到UDP包中,這稱為資料報。 DatagramSocket來發送這個包。要接受資料,可以從DatagramSocket中接受一個 DatagramPack物件,然後從該包中讀取資料的內容。
使用UDP傳輸資料是有大小限制的,每個被傳輸的資料報必須限定在64KB之內。
2 DatagramSocket類
建構函式
建構函式 | 說明 |
---|---|
DatagramSocket() |
建立例項,通常用於客戶端程式設計,他並沒有特定的監聽埠,僅僅使用一個臨時的。 |
DatagramSocket(int port) |
建立例項,並固定監聽Port埠的報文。 |
DatagramSocket(int port, InetAddress laddr) |
這是個非常有用的構建器,當一臺機器擁有多於一個IP地址的時候,由它建立的例項僅僅接收來自LocalAddr的報文。 |
DatagramSocket(SocketAddress bindaddr) |
bindaddr物件中指定了埠和地址。 |
常用函式
常用函式 | 說明 |
---|---|
receive(DatagramPacket p) |
接收資料報文到p中。**注意:**receive方法是阻塞的,如果沒有接收到資料報包的話就會阻塞在哪裡。 |
send(DatagramPacket p) |
傳送報文p到目的地。 |
setSoTimeout(int timeout) |
設定超時時間,單位為毫秒。 |
close() |
關閉DatagramSocket。在應用程式退出的時候,通常會主動的釋放資源,關閉Socket,但是由於異常的退出可能造成資源無法回收。所以應該在程式完成的時候,主動使用此方法關閉Socket,或在捕獲到異常後關閉Socket。 |
注意
- 在建立DatagramSocket類例項時,如果埠已經被使用,會產生一個SocketException的異常丟擲,並導致程式非法終止,這個異常應該注意捕獲。
- “阻塞”是一個專業名詞,它會產生一個內部迴圈,是程式暫停在這個地方,直到條件被觸發。
3 DatagramPacket類
用於處理報文,將位元組陣列、目標地址、目標埠等資料包裝成報文或者將報文拆卸成位元組陣列。
建構函式
建構函式 | 說明 |
---|---|
DatagramPacket(byte[] buf, int length, InetAddress addr, int port) |
從buf位元組陣列中取出offset開始的、length長的資料建立資料物件,目標地址是addr,目標埠是port。 |
DatagramPacket(byte buf[], int offset, int length, SocketAddress address) |
從buf位元組陣列中取出offset開始的、length長的資料建立資料物件,目標地址是address |
常用函式
常用函式 | 說明 |
---|---|
getData() byte[] | 從例項中取得報文中的位元組陣列編碼。 |
setData(byte[] buf, int offset, int length) | 設定資料報包中的資料內容 |