UDP通訊程式
宣告
文章僅用作個人學習,原文連結:https://blog.csdn.net/qq_46331050/article/details/117706050
2.UDP通訊程式
2.1 UDP通訊原理
-
UDP協議是一種不可靠的網路協議,它在通訊的兩端各建立一個Socket物件,但是這兩個Socket只是傳送,接收資料的物件
-
基於UDP協議的通訊雙方而言,沒有客戶端和伺服器概念
三個概念:資料包(Packet)、資料報(Datagram)和套接字(Socket)
1、資料報(Datagram)
-
資料報是通過網路傳輸的資料的基本單元,包含一個報頭(header)和資料本身,其中報頭描述了資料的目的地以及和其它資料之間的關係
-
UDP資料報的長度是指包括報頭和資料部分在內的總位元組數,其中報頭長度固定,資料部分可變。資料報的最大長度根據操作環境的不同而各異。從理論上說,包含報頭在內的資料報的最大長度為65535位元組(64K)
-
我們在用Socket程式設計時,UDP協議要求包小於64K,TCP沒有限定
2、套接字(Socket)
-
所謂套接字(Socket),就是對網路中不同主機上的應用程序之間進行雙向通訊的端點的抽象
-
從所處的地位來講,套接字上聯應用程序,下聯網路協議棧
3、資料包(Packet)
- 包(Packet)是TCP/IP協議通訊傳輸中的資料單位,一般也稱“資料包”
相關類
Java提供了DatagramSocket類和DatagramPacket類
-
DatagramSocket:用於傳送或接收資料包的套接字
-
DatagramPacket:資料包
DatagramSocket類
-
此類表示用於傳送和接收資料報資料包的套接字
-
資料報套接字是分組傳送服務的傳送或接收點
常用構造器
常用構造器 | 說明 |
---|---|
DatagramSocket() |
構造資料報套接字並將其繫結到本地主機上的任何可用埠 |
DatagramSocket(int port) |
構造資料報套接字並將其繫結到本地主機上的指定埠 |
常用方法
常用方法 | 說明 |
---|---|
void send(DatagramPacket p) |
從此套接字傳送資料報包 |
void receive(DatagramPacket p) |
從此套接字接收資料報包(阻塞式的接收) |
DatagramPacket類
-
該類表示資料報包
-
資料報包用於實現無連線分組傳送服務
常用構造器
常用構造器 | 說明 |
---|---|
(接收方) DatagramPacket(byte[] buf, int length)
|
構造一個 DatagramPacket用於接收長度的資料包 length |
(傳送方)DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
|
構造用於傳送指定長度的資料報包到指定主機的指定埠號上 |
常用方法
常用方法 | 說明 |
---|---|
int getLength() |
返回要傳送的資料的長度或接收到的資料的長度 |
byte[] getData() |
返回資料緩衝區 |
2.2 UDP傳送資料
傳送步驟
-
建立傳送端的Socket物件(DatagramSocket)。如果沒有指定埠,傳送到本地主機所有可用埠(不常用),這裡可以採用指定埠構造方法
DatagramSocket()
,DatagramSocket(int port)
-
建立資料,並把資料封裝成DatagramPacket包裹,資料一定要轉成位元組陣列,同時需要指定IP地址和埠
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
-
呼叫DatagraSocket物件的方法傳送資料包裹
void send(DatagramPacket p)
-
關閉傳送端,釋放資源
void close()
程式碼
2.3 UDP接收資料
接收步驟
-
建立接收端的Socket物件(DatagramSocket),指定埠
DatagramSocket(int port)
-
準備容器,封裝成DatagramPacket包裹,用於接收資料
DatagramPacket(byte[] buf, int length)
-
呼叫DatagramSocket物件的方法,阻塞式接收包裹
void receive(DatagramPacket p)
-
解析資料包,並把資料在控制檯顯示
byte[] getData() 和 int getLength()
-
關閉接收端,釋放資源
void close()
程式碼
傳送、接收資料練習注意點
-
同一臺機器操作時,如果傳送包裹的目的地埠和接收端的埠名不一致時,將會導致包裹丟失,接收不到資料
-
如果同一臺機器下采用重複埠,會報錯
BindException: Address already in use: bind
埠重複使用 -
請注意,這一點尤為重要!!!
當寫完接收和傳送程式以後
一定要先啟動接收程式,再啟動傳送程式傳送資料,才能在接收端接收到傳送的資料!!!