JAVA網路程式設計之UDP通訊的實現步驟
與TCP相比,UDP是一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務。UDP通訊主要用到兩個類DatagramPacket和DatagramSocket,下面分別介紹。
1、DatagramSocket
此類表示用來發送和接收資料報包的套接字。
資料報套接字是包投遞服務的傳送或接收點。每個在資料報套接字上傳送或接收的包都是單獨編址和路由的。從一臺機器傳送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。
在 DatagramSocket 上總是啟用 UDP 廣播發送。為了接收廣播包,應該將 DatagramSocket 繫結到萬用字元地址。在某些實現中,將 DatagramSocket 繫結到一個更加具體的地址時廣播包也可以被接收。
構造方法:
DatagramSocket() ~ 構造資料報套接字並將其繫結到本地主機上任何可用的埠。
protected DatagramSocket(DatagramSocketImpl impl) ~建立帶有指定 DatagramSocketImpl (資料報和多播套接字實現的抽象基類,可以通過它將資料報套接字繫結到本地埠和地址。)的未繫結資料報套接字。
DatagramSocket(int port) ~建立資料報套接字並將其繫結到本地主機上的指定埠。
DatagramSocket(int port, InetAddress laddr) ~建立資料報套接字,將其繫結到指定的本地地址。
DatagramSocket(SocketAddress bindaddr) ~建立資料報套接字,將其繫結到指定的本地套接字地址。 (SocketAddress 作為一個抽象類,應通過特定的、協議相關的實現為其建立子類。 它提供不可變物件,供套接字用於繫結、連線或用作返回值。 )
DatagramSocket(DatagramSocketImpl impl)和DatagramSocket(SocketAddress bindaddr)就是通過一個物件來進行本地埠和地址的繫結……。
2、DatagramPacket此類表示資料報包。
資料報包用來實現無連線包投遞服務。每條報文僅根據該包中包含的資訊從一臺機器路由到另一臺機器。從一臺機器傳送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。不對包投遞做出保證。
3、通訊過程
基於UDP的套接字就是資料報套接字(Java.net.DatagramSocketj)。
兩個都要先構造好相應的資料包(java.net.DatagramPacket)。
在DatagramPacket包中的函式 intgetLength()返回實際接受的位元組數, byte[]getData()返回接受到的資料。
要想接受端給傳送端回信息,就需要知道傳送端的IP地址InetAddress getAddress()和傳送端程序所繫結的埠號int getPort()。
資料報套接字傳送成功之後,就相當於建立了一個虛連線,雙方可以傳送資料。
4、具體示例(客戶端訪問伺服器端)
伺服器端:
/*
* 伺服器端,實現基於UDP的使用者登陸
*/
public class UDPServer {
public static void main(String[] args) throws IOException {
/*
* 接收客戶端傳送的資料
*/
// 1.建立伺服器端DatagramSocket,指定埠
DatagramSocket socket = new DatagramSocket(8800);
// 2.建立資料報,用於接收客戶端傳送的資料
byte[] data = new byte[1024];// 建立位元組陣列,指定接收的資料包的大小
DatagramPacket packet = new DatagramPacket(data, data.length);
// 3.接收客戶端傳送的資料
System.out.println("****伺服器端已經啟動,等待客戶端傳送資料");
socket.receive(packet);// 此方法在接收到資料報之前會一直阻塞
// 4.讀取資料
String info = new String(data, 0, packet.getLength());
System.out.println("我是伺服器,客戶端說:" + info);
/*
* 向客戶端響應資料
*/
// 1.定義客戶端的地址、埠號、資料
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] data2 = "歡迎您!".getBytes();
// 2.建立資料報,包含響應的資料資訊
DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
// 3.響應客戶端
socket.send(packet2);
// 4.關閉資源
socket.close();
}
}
客戶端:
/*
* 客戶端
*/
public class UDPClient {
public static void main(String[] args) throws IOException {
/*
* 向伺服器端傳送資料
*/
// 1.定義伺服器的地址、埠號、資料
InetAddress address = InetAddress.getByName("localhost");
int port = 8800;
byte[] data = "使用者名稱:admin;密碼:123".getBytes();
// 2.建立資料報,包含傳送的資料資訊
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
// 3.建立DatagramSocket物件
DatagramSocket socket = new DatagramSocket();
// 4.向伺服器端傳送資料報
socket.send(packet);
/*
* 接收伺服器端響應的資料
*/
// 1.建立資料報,用於接收伺服器端響應的資料
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
// 2.接收伺服器響應的資料
socket.receive(packet2);
// 3.讀取資料
String reply = new String(data2, 0, packet2.getLength());
System.out.println("我是客戶端,伺服器說:" + reply);
// 4.關閉資源
socket.close();
}
}
完!!!