將想法與焦點(diǎn)和您一起共享

Java網(wǎng)絡(luò )編程基礎(三) Datagram類(lèi)使用方法發(fā)布者:本站     時(shí)間:2020-05-06 16:05:13

Datagram(數據包)是一種盡力而為的傳送數據的方式,它只是把數據的目的地記錄在數據包中,然后就直接放在網(wǎng)絡(luò )上,系統不保證數據是否能安全送到,或者什么時(shí)候可以送到,也就是說(shuō)它并不保證傳送質(zhì)量。

1 UDP套接字

數據報(Datagram)是網(wǎng)絡(luò )層數據單元在介質(zhì)上傳輸信息的一種邏輯分組格式,它是一種在網(wǎng)絡(luò )中傳播的、獨立的、自身包含地址信息的消息,它能否到達目的地、到達的時(shí)間、到達時(shí)內容是否會(huì )變化不能準確地知道。它的通信雙方是不需要建立連接的,對于一些不需要很高質(zhì)量的應用程序來(lái)說(shuō),數據報通信是一個(gè)非常好的選擇。還有就是對實(shí)時(shí)性要求很高的情況,比如在實(shí)時(shí)音頻和視頻應用中,數據包的丟失和位置錯亂是靜態(tài)的,是可以被人們所忍受的,但是如果在數據包位置錯亂或丟失時(shí)要求數據包重傳,就是用戶(hù)所不能忍受的,這時(shí)就可以利用UDP協(xié)議傳輸數據包。在Java的java.net包中有兩個(gè)類(lèi)DatagramSocket和DatagramPacket,為應用程序中采用數據報通信方式進(jìn)行網(wǎng)絡(luò )通信。

使用數據包方式首先將數據打包,Java.net包中的DategramPacket類(lèi)用來(lái)創(chuàng )建數據包。數據包有兩種,一種用來(lái)傳遞數據包,該數據包有要傳遞到的目的地址;另一種數據包用來(lái)接收傳遞過(guò)來(lái)的數據包中的數據。要創(chuàng )建接收的數據包,通過(guò)DatagramPackett類(lèi)的方法構造:

public DatagramPacket(byte ibuft[],int ilength)

public DatagramPacket( byte ibuft[],int offset ,int ilength)

ibuf[]為接受數據包的存儲數據的緩沖區的長(cháng)度,ilength為從傳遞過(guò)來(lái)的數據包中讀取的字節數。當采用第一種構造方法時(shí),接收到的數據從ibuft[0]開(kāi)始存放,直到整個(gè)數據包接收完畢或者將ilength的字節寫(xiě)入ibuft為止。采用第二種構造方法時(shí),接收到的數據從ibuft[offset]開(kāi)始存放。如果數據包長(cháng)度超出了ilength,則觸發(fā)IllegalArgument-Exception。不過(guò)這是RuntimeException,不需要用戶(hù)代碼捕獲。示范代碼如下:

byte[ ] buffer=new byte[8912];

DatagramPacket datap=new DatagramPacket(buffer ,buffer.length( ));

創(chuàng )建發(fā)送數據包的構造方法為:

public DatagramPacket(byt ibuf[],int ilength,InetAddrss iaddr,int port)

public DatagramPacket(byt ibuf[],int offset , int ilength,InetAddrss iaddr,int port)

iaddr為數據包要傳遞到的目標地址,port為目標地址的程序接受數據包的端口號(即目標地址的計算機上運行的客戶(hù)程序是在哪一個(gè)端口接收服務(wù)器發(fā)送過(guò)來(lái)的數據包)。ibuf[]為要發(fā)送數據的存儲區,以ibuf數組的offset位置開(kāi)始填充數據包ilength字節,如果沒(méi)有offset,則從ibuf數組的0位置開(kāi)始填充。以下示范代碼是要發(fā)送一串字符串:


String s = new String("java networking");
byte[ ] data=s.getbytes();
int port=1024;
try{
InetAddress ineta= InetAddress.getByName(" 169.254.0.14");
DatagramPacket datap=new DatagramPacket
(data ,data.length( ),ineta,port);
}
catch(IOException e) {
}
 

數據包也是對象,也有操作方法用來(lái)獲取數據包的信息,這是很有用的。其方法如下:

public InetAddress getAddress() 如果是發(fā)送數據包,則獲得數據包要發(fā)送的目標地址,但是如果是接收數據包則返回發(fā)送此數據包的源地址。

 

public byte[]getData()

返回一個(gè)字節數組,其中是數據包的數據。如果想把字節數組轉換成別的類(lèi)型就要進(jìn)行轉化。如果想轉化成String類(lèi)型,可以進(jìn)行以下的處理,設DatagramPacket datap為:

String s = new String(datap.getbytes());

public int getLength() 獲得數據包中數據的字節數。

pubic int getPort( ) 返回數據包中的目標地址的主機端口號。

發(fā)送和接收數據包還需要發(fā)送和接收數據包的套接字,即DatagramSocket對象,DatagramSocket套接字在本地機器端口監聽(tīng)是否有數據到達或者將數據包發(fā)送出去。其構造方法如下。

public DatagramSocket() 用本地機上任何一個(gè)可用的端口創(chuàng )建一個(gè)套接字,這個(gè)端口號是由系統隨機產(chǎn)生的。使用方法如下:


try{
DatagramSocket datas=new DatagramSocket( );
//發(fā)送數據包
}
catch(SocketException e){
}
 

這種構造方法沒(méi)有指定端口號,可以用在客戶(hù)端。如果構造不成功則觸發(fā)SocketException異常。

public DatagramSocket(int port)

用一個(gè)指定的端口號port創(chuàng )建一個(gè)套接字。

當不能創(chuàng )建套接字時(shí)就拋出SocketException異常,其原因是指定的端口已被占用或者是試圖連接低于1024的端口,但是又沒(méi)有具備權限。

2 實(shí)例:利用DatagramSocket查詢(xún)端口占用情況

我們可以利用這個(gè)異常探查本地機的端口號有沒(méi)有服務(wù)。見(jiàn)示例12-9。

【程序源代碼】


1 // ==================== Program Description =====================
2 // 程序名稱(chēng):示例12-9: UDPScan.java
3 // 程序目的:熟悉DatagramSocket的基本用法,查詢(xún)端口的占用情況
4 //=========================================================
5 import java.net.*;
6
7 public class UDPScan
8 {
9 public static void main(String args[])
10 {
11 for (int port=1024;port<=65535;port++) {
12 try {
13 DatagramSocket server=new DatagramSocket(port);
14 server.close();
15 }
16 catch(SocketException e) {
17 System.out.println("there is a server in port "+port+".");
18 }
19 }
20 }
21 }
 

【程序輸出結果】

there is a server in port 1026.

there is a server in port 1028.

there is a server in port 1046.

there is a server in port 1900.

【程序注解】

在第11~19行我們用for循環(huán)以端口號為參數實(shí)例化DatagramSocket,其中端口號從1024到65535。如果在實(shí)例過(guò)程中出錯,會(huì )拋出SocketException異常。我們根據這個(gè)異常就可以判斷出哪些端口被占用,哪些還是空閑的。值得一提的是,我們在實(shí)例化了DatagramSocket后,調用了close()關(guān)閉它。作為一種好的作風(fēng),應該遵循。端口號在1024以下的系統可能會(huì )用到,比如HTTP默認為80端口,FTP默認為21端口,等等,所以我們從1024端口開(kāi)始探查。



選擇我們,優(yōu)質(zhì)服務(wù),不容錯過(guò)
1. 優(yōu)秀的網(wǎng)絡(luò )資源,強大的網(wǎng)站優(yōu)化技術(shù),穩定的網(wǎng)站和速度保證
2. 15年上海網(wǎng)站建設經(jīng)驗,優(yōu)秀的技術(shù)和設計水平,更放心
3. 全程省心服務(wù),不必擔心自己不懂網(wǎng)絡(luò ),更省心。
------------------------------------------------------------
24小時(shí)聯(lián)系電話(huà):021-58370032
最新国产精品第二页_色资源av中文无码先锋_中国xx爽69护士_日韩欧美亚洲每日更新在线观看