Java UDP通信(DatagramPacket類、DatagramSocket類、InetAddress類)(轉)


一、DatagramPacket類:

如果把DatagramSocket比作創建的港口碼頭,那么DatagramPacket就是發送和接收數據的集裝箱。
構造函數:一個用來接收數據,一個用來發送數據
public DatagramPacket(byte[] buf,int length) //接收數據
構造 DatagramPacket 用來接收長度為 ilength 的包。 
public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
構造數據報文包用來把長度為 ilength 的包傳送到指定宿主的指定的端口號。
getAddress() 
返回接收或發送此數據報文的機器的 IP 地址。 
getData() 
返回接收的數據或發送出的數據。 
getLength() 
返回發送出的或接收到的數據的長度。 
getPort() 
返回接收或發送該數據報文的遠程主機端口號。

二、DatagramSocket類

此類表示用來發送和接收數據報包的套接字。 數據報套接字是包投遞服務的發送或接收點。
DatagramSocket(int port)     創建數據報套接字並將其綁定到本地主機上的指定端口。
DatagramSocket(int port, InetAddress laddr)     創建數據報套接字,將其綁定到指定的本地地址。

receive(DatagramPacket p) 
             從此套接字接收數據報包。 
void send(DatagramPacket p) 
             從此套接字發送數據報包。 
bind(SocketAddress addr) 
             將此 DatagramSocket 綁定到特定的地址和端口。 
void close() 
             關閉此數據報套接字。 
void connect(InetAddress address, int port) 
             將套接字連接到此套接字的遠程地址。 
void connect(SocketAddress addr) 
             將此套接字連接到遠程套接字地址(IP 地址 + 端口號)。 
void disconnect() 
             斷開套接字的連接。 
getInetAddress() 
             返回此套接字連接的地址。 
InetAddress getLocalAddress() 
             獲取套接字綁定的本地地址。

三、InetAddress類
InetAddress用於表示計算機IP地址的一個類,而在日常應用中的IP地址用"192.168.0.1",
"WWW.it315.org"等字符串格式表示的。
getByName方法
getHostAddress方法

四、UDP通信示例代碼:

發送端代碼UdpSend.java:

import java.net.*;

public class UdpSend {
          public static void main(String[] args) throws Exception{
            DatagramSocket ds=new DatagramSocket();
           String strInfo="Hello Taohx";
           ds.send(new DatagramPacket(strInfo.getBytes(),strInfo.length(),
                                    InetAddress.getByName("59.64.157.93"),3000));
           ds.close();            
       }
}

接收代碼UdpRecv.java:

import java.net.*;
public class UdpRecv {
       public static void main(String[] args) throws Exception{
           DatagramSocket ds=new DatagramSocket(3000);
           byte [] buf=new byte[1024];
           DatagramPacket dp=new DatagramPacket(buf,1024);
           ds.receive(dp);
          String strInfo= new String(dp.getData(),0,dp.getLength())+
            " from "+dp.getAddress().getHostAddress()+":"+dp.getPort();
           System.out.println(strInfo);
           ds.close();
            
       }
}

注意:若發送中文信息時,因為中文字符占兩個字節,故發送代碼 ds.send要修改如下才可正確地發送中文信息,

ds.send(new DatagramPacket(strInfo.getBytes(),strInfo.getBytes().length,
                                   InetAddress.getByName("59.64.157.93"),3000));

***********************************************************************************************************

在Java中操縱UDP 

  使用位於JDK中Java.net包下的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類有3個構建器: 

DatagramSocket():創建實例。這是個比較特殊的用法,通常用於客戶端編程,它並沒有特定監聽的端口,僅僅使用一個臨時的。 

DatagramSocket(int port):創建實例,並固定監聽Port端口的報文。 

DatagramSocket(int port, InetAddress localAddr):這是個非常有用的構建器,當一台機器擁有多於一個IP地址的時候,由它創建的實例僅僅接收來自LocalAddr的報文。 

值得注意的是,在創建DatagramSocket類實例時,如果端口已經被使用,會產生一個SocketException的異常拋出,並導致程序非法終止,這個異常應該注意捕獲。DatagramSocket類最主要的方法有4個: 

Receive(DatagramPacket d):接收數據報文到d中。receive方法產生一個“阻塞”。 

Send(DatagramPacket d):發送報文d到目的地。 

SetSoTimeout(int timeout):設置超時時間,單位為毫秒。 

Close():關閉DatagramSocket。在應用程序退出的時候,通常會主動釋放資源,關閉Socket,但是由於異常地退出可能造成資源無法回收。所以,應該在程序完成時,主動使用此方法關閉Socket,或在捕獲到異常拋出后關閉Socket。 

“阻塞”是一個專業名詞,它會產生一個內部循環,使程序暫停在這個地方,直到一個條件觸發。 

DatagramPacket類用於處理報文,它將Byte數組、目標地址、目標端口等數據包裝成報文或者將報文拆卸成Byte數組。應用程序在產生數據包是應該注意,TCP/IP規定數據報文大小最多包含65507個,通常主機接收548個字節,但大多數平台能夠支持8192字節大小的報文。DatagramPacket類的構建器共有4個: 

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[1000];

DatagramSocket ds = new DatagramSocket(12345);

//開始監視12345端口

DatagramPacket ip = new DatagramPacket(buf, buf.length);

//創建接收數據報的實例

while (true)

{

ds.receive(ip);

//阻塞,直到收到數據報后將數據裝入IP中

System.out.println(new String(buf));

}


{發送數據的客戶端} 


InetAddress target = InetAddress.getByName(“www.xxx.com“);

//得到目標機器的地址實例

DatagramSocket ds = new DatagramSocket(9999);

//從9999端口發送數據報

String hello = “Hello, I am come in!”;

//要發送的數據

byte[] buf = hello.getBytes();

//將數據轉換成Byte類型

op = new DatagramPacket(buf, buf.length, target, 12345);

//將BUF緩沖區中的數據打包

ds.send(op);

//發送數據

ds.close();

//關閉連接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM