Android收發UDP報文詳解

2021-10-05 12:38:35 字數 4205 閱讀 7351

參考鏈結如下,寫的非常非常好,我只是把他們寫的優秀的搬過來做筆記,防止以後忘記,本部落格所有內容均經過**驗證

1. 構造datagramsocket物件

2. 根據傳送ip 來建立inetaddress物件

3. 根據inetaddress物件、傳送埠號、傳送資料 來建立傳送的datagrampacket資料報物件

4. 呼叫datagramsocket物件的send(datagrampacket) 方法,傳送udp報文

5. 呼叫datagramsocket物件的close() 關閉套接字連線

1. 需要根據接收埠號 構造datagramsocket物件

2. 建立傳送的datagrampacket資料報物件

3. 呼叫datagramsocket物件的receive(datagrampacket)方法,接收udp報文

首先學習了解一下udp、tcp是什麼東西,基礎知識的鏈結如下,非常全了,不再贅述

通過上面的udp傳送、接收步驟可以看出來,datagramsocket、inetaddress、datagrampacket這3個物件很關鍵,下面給出三個物件的建構函式及方法,補充一下基礎,如下:

(1)定義概念

此類表示用來傳送和接收資料報包的套接字。

資料報套接字是包投遞服務的傳送或接收點。每個在資料報套接字上傳送或接收的包都是單獨編址和路由的。從一台機器傳送到另一台機器的多個包可能選擇不同的路由,也可能按不同的順序到達。

在 datagramsocket 上總是啟用 udp 廣播傳送。為了接收廣播包,應該將 datagramsocket 繫結到萬用字元位址。在某些實現中,將 datagramsocket 繫結到乙個更加具體的位址時廣播包也可以被接收。

(2)建構函式總結

建構函式名稱含義

datagramsocket()構造資料報套接字並將其繫結到本地主機上任何可用的埠。

datagramsocket(int port)建立資料報套接字並將其繫結到本地主機上的指定埠。

datagramsocket(int port, inetaddress laddr)建立資料報套接字,將其繫結到指定的本地位址。

(3)重要方法摘要

方法名稱含義

void close()

關閉此資料報套接字。

void connect(inetaddress address, int port)

將套接字連線到此套接字的遠端位址

boolean isclosed()

返回是否關閉了套接字。

void receive(datagrampacket p)

從此套接字接收資料報包。

void send(datagrampacket p)

從此套接字傳送資料報包。

datagramsocket(int port, inetaddress laddr)

建立資料報套接字,將其繫結到指定的本地位址。

(1) 定義概念

此類表示網際網路協議 (ip) 位址。

ip 位址是 ip 使用的 32 位或 128 位無符號數字,它是一種低階協議,udp 和 tcp 協議都是在它的基礎上構建的。inetaddress 的例項包含 ip 位址,還可能包含相應的主機名(取決於它是否用主機名構造或者是否已執行反向主機名解析)。

(2)建立方法

注意,建立此類事通過類方法而獲取,並非構造方法。

方法名稱

含義static inetaddress getbyaddress(byte addr)

在給定原始 ip 位址的情況下,返回 inetaddress 物件。

static inetaddress getbyaddress(string host, byte addr)

根據提供的主機名和 ip 位址建立 inetaddress。

static inetaddress getbyname(string host)

在給定主機名的情況下確定主機的 ip 位址。

表示資料報包。

1.3datagrampacket學習

(1)定義概念

此類表示資料報。

資料報包用來實現無連線包投遞服務。每條報文僅根據該包中包含的資訊從一台機器路由到另一台機器。從一台機器傳送到另一台機器的多個包可能選擇不同的路由,也可能按不同的順序到達。不對包投遞做出保證。

(2)構造方法

建構函式名稱

含義datagrampacket(byte buf, int length)

用來接收長度為 length 的資料報

datagrampacket(byte buf, int length, inetaddress address, int port)

構造資料報包,用來將長度為 length 的包傳送到指定主機上的指定埠號

在此程式中,將udp報文的傳送、接收操作分別寫入到兩個執行緒中,根據具體需求進行呼叫。

以下步驟都在傳送執行緒內,需要注意的是傳送udp報文邏輯單一,順序執行完畢執行緒即可結束,不涉及到後台等待的需求,所以執行完後即可關閉套接字連線。

傳送步驟

構造datagramsocket物件

根據傳送ip 來建立inetaddress物件

根據inetaddress物件、傳送埠號、傳送資料 來建立傳送的datagrampacket資料報物件

呼叫datagramsocket物件的send(datagrampacket) 方法,傳送udp報文

呼叫datagramsocket物件的close() 關閉套接字連線

對應以上步驟,**展示(僅為部分重要**):

byte buf="hello android! ".getbytes();

datagramsocket sendsocket = new datagramsocket();

inetaddress serveraddr = inetaddress.getbyname(send_ip);

datagrampacket outpacket = new datagrampacket(buf, buf.length,serveraddr, send_port);

sendsocket.send(outpacket);

sendsocket.close();

以下步驟都在接收執行緒內,同傳送執行緒大致相同,但需要注意這兩者本質的區別:傳送執行緒裡的邏輯執行一遍即可結束,但是接收執行緒需要在後台待定等待接收udp報文,不可執行一遍就結束!相當於在乙個介面中,可多次建立傳送執行緒用來傳送報文,但是接收執行緒只需在介面初始化時建立,從而一直監聽報文接收(若重新進入介面,邏輯如上)。

所以,在接收執行緒內部需要用到迴圈,在迴圈內部呼叫套接字物件的receive() 方法來接收udp報文。注意套接字物件的連線關閉,傳送執行緒中單一的邏輯,執行完傳送過程即可關閉連線,但是在接收執行緒中使用了迴圈,所以需要用乙個全域性標識量來控制迴圈,若介面退出或銷毀則將標示值置為false,這樣接收執行緒即可結束,再關閉套接字連線。

接收步驟

需要根據接收埠號 構造datagramsocket物件

建立傳送的datagrampacket資料報物件

呼叫datagramsocket物件的receive(datagrampacket) 方法,接收udp報文

對應以上步驟,**展示(僅為部分重要**):

datagramsocket receivesocket = new datagramsocket(receive_port);

while(listenstatus)

receiveinfo = inpacket.getdata();

receivehandler.sendemptymessage(1);

}

UDP 收 發 廣播包

如果網路中兩個主機上的應用程式要相互通訊,其一要知道彼此的ip,其二要知道程式可監聽的埠。因為同一主機上的程式使用網路是通過埠號來區分的。1.初始化網路庫 2.建立sock dgram型別的socket。3.繫結套接字。4.傳送 接收資料。5.銷毀套接字。6.釋放網路庫。專門用於同時向網路中所有工作...

UDP 收 發 廣播包

如果網路中兩個主機上的應用程式要相互通訊,其一要知道彼此的ip,其二要知道程式可監聽的埠。因為同一主機上的程式使用網路是通過埠號來區分的。1.初始化網路庫 2.建立sock dgram型別的socket。3.繫結套接字。4.傳送 接收資料。5.銷毀套接字。6.釋放網路庫。專門用於同時向網路中所有工作...

UDP報文分片問題

在進行udp程式設計的時候,我們最容易想到的問題就是,一次傳送多少bytes好?當然,這個沒有唯一答案,相對於不同的系統,不同的要求,其得到的答案是不一樣的,我這裡僅對 像icq一類的傳送聊天訊息的情況作分析,對於其他情況,你或許也能得到一點幫助 首先,我們知道,tcp ip通常被認為是乙個四層協議...