什麼是UDP協議
UDP協議的全稱是用戶數據報
在網絡中它與TCP協議一樣用於處理數據包
在OSI模型中
在第四層——傳輸層
處於IP協議的上一層
UDP有不提供數據報分組
組裝和不能對數據包的排序的缺點
也就是說
當報文發送之後
是無法得知其是否安全完整到達的
為什麼要使用UDP
在選擇使用協議的時候
選擇UDP必須要謹慎
在網絡質量令人不十分滿意的環境下
UDP協議數據包丟失會比較嚴重
但是由於UDP的特性
它不屬於連接型協議
因而具有資源消耗小
處理速度快的優點
所以通常音頻
視頻和普通數據在傳送時使用UDP較多
因為它們即使偶爾丟失一兩個數據包
也不會對接收結果產生太大影響
比如我們聊天用的ICQ和OICQ就是使用的UDP協議
在Java中操縱UDP
使用位於JDK中包下的DatagramSocket和DatagramPacket類
可以非常方便地控制用戶數據報文
在描述它們之前
必須了解位於同一個位置的InetAddress類
InetAddress實現了Java
io
Serializable接口
不允許繼承
它用於描述和包裝一個Internet IP地址
通過三個方法返回InetAddress實例
getLocalhost()
返回封裝本地地址的實例
getAllByName(String host)
返回封裝Host地址的InetAddress實例數組
getByName(String host)
返回一個封裝Host地址的實例
其中
Host可以是域名或者是一個合法的IP地址
DatagramSocket類用於創建接收和發送UDP的Socket實例
和Socket類依賴SocketImpl類一樣
DatagramSocket類的實現也依靠專門為它設計的DatagramScoketImplFactory類
DatagramSocket類有
個構建器
DatagramSocket()
創建實例
這是個比較特殊的用法
通常用於客戶端編程
它並沒有特定監聽的端口
僅僅使用一個臨時的
DatagramSocket(int port)
創建實例
並固定監聽Port端口的報文
DatagramSocket(int port
InetAddress localAddr)
這是個非常有用的構建器
當一台機器擁有多於一個IP地址的時候
由它創建的實例僅僅接收來自LocalAddr的報文
值得注意的是
在創建DatagramSocket類實例時
如果端口已經被使用
會產生一個SocketException的異常拋出
並導致程序非法終止
這個異常應該注意捕獲
DatagramSocket類最主要的方法有
個
Receive(DatagramPacket d)
接收數據報文到d中
receive方法產生一個
阻塞
Send(DatagramPacket d)
發送報文d到目的地
SetSoTimeout(int timeout)
設置超時時間
單位為毫秒
Close()
關閉DatagramSocket
在應用程序退出的時候
通常會主動釋放資源
關閉Socket
但是由於異常地退出可能造成資源無法回收
所以
應該在程序完成時
主動使用此方法關閉Socket
或在捕獲到異常拋出後關閉Socket
阻塞
是一個專業名詞
它會產生一個內部循環
使程序暫停在這個地方
直到一個條件觸發
DatagramPacket類用於處理報文
它將Byte數組
目標地址
目標端口等數據包裝成報文或者將報文拆卸成Byte數組
應用程序在產生數據包是應該注意
TCP/IP規定數據報文大小最多包含
個
通常主機接收
個字節
但大多數平台能夠支持
字節大小的報文
DatagramPacket類的構建器共有
個
DatagramPacket(byte[] buf
int length
InetAddress addr
int port)
從Buf數組中
取出Length長的數據創建數據包對象
目標是Addr地址
Port端口
DatagramPacket(byte[] buf
int offset
int length
InetAddress address
int port)
從Buf數組中
取出Offset開始的
Length長的數據創建數據包對象
目標是Addr地址
Port端口
DatagramPacket(byte[] buf
int offset
int length)
將數據包中從Offset開始
Length長的數據裝進Buf數組
DatagramPacket(byte[] buf
int length)
將數據包中Length長的數據裝進Buf數組
DatagramPacket類最重要的方法就是getData()了
它從實例中取得報文的Byte數組編碼
★簡單的實例說明
{接收數據的服務器}
byte[] buf = new byte[
];
DatagramSocket ds = new DatagramSocket(
);
//開始監視
端口
DatagramPacket ip = new DatagramPacket(buf
buf
length);
//創建接收數據報的實例
while (true)
{
ds
receive(ip);
//阻塞
直到收到數據報後將數據裝入IP中
System
out
println(new String(buf));
}
{發送數據的客戶端}
InetAddress target = InetAddress
getByName(
);
//得到目標機器的地址實例
DatagramSocket ds = new DatagramSocket(
);
//從
端口發送數據報
String hello =
Hello
I am come in!
;
//要發送的數據
byte[] buf = hello
getBytes();
//將數據轉換成Byte類型
op = new DatagramPacket(buf
buf
length
target
);
//將BUF緩沖區中的數據打包
ds
send(op);
//發送數據
ds
close();
//關閉連接
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25703.html