前面的TCP是有可靠的,有序的。現在看看UDP,UDP是不可靠的,無序的。
現在看看實現:
這裏我也用兩個類模擬了客戶端與服務端,
現在直接看下代碼:
UDPServer.java:
package com.socket.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* UDP 服務端
*
* @author lolli
*
*/
public class UDPServer {
public static void main(String[] args) {
try {
// 創建服務器端的DatagramSocket,並指定端口
DatagramSocket datagramSocket = new DatagramSocket(8888);
System.out.println("***** 啓動服務器,等待客戶端的連接請求 ******");
byte[] data = new byte[2048];
// 創建數據報,用戶接受客戶端請求的數據
DatagramPacket datagramPacket = new DatagramPacket(data, data.length);
// 接收客戶端請求的數據(在接收到數據之前一直處於阻塞狀態)
datagramSocket.receive(datagramPacket);
// 獲取請求的數據,並轉成String打印出來
String clientData = new String(data, 0, datagramPacket.getLength());
System.out.println("我是服務端,客戶端請求的數據爲:" + clientData);
// *** 給客戶端進行相應 ***
// 定義客戶端的地址
InetAddress inetAddress = datagramPacket.getAddress();
int port = datagramPacket.getPort();
byte[] backData = "我接受到了客戶端的數據,你好!".getBytes();
// 創建數據包,給客戶端響應數據
DatagramPacket backDatagramPacket = new DatagramPacket(backData, backData.length, inetAddress, port);
// 給客戶端發送數據
datagramSocket.send(backDatagramPacket);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
再看看客戶端:
UDPClient.java:
package com.socket.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
/**
* UDP 客戶端
* @author lolli
*
*/
public class UDPClient {
public static void main(String[] args) {
try {
// 定義服務器地址
InetAddress inetAddress = InetAddress.getByName("localhost");
byte[] data = "我是客戶端,hello".getBytes();
// 創建數據報,準備數據
DatagramPacket datagramPacket = new DatagramPacket(data, data.length, inetAddress, 8888);
// 創建一個DatagramSocket
DatagramSocket datagramSocket = new DatagramSocket();
// 發送請求
datagramSocket.send(datagramPacket);
// *** 接收服務端響應回來的數據 ***
byte[] resData = new byte[2048];
// 創建數據報,用戶接受客戶端請求的數據
DatagramPacket resDatagramPacket = new DatagramPacket(resData, resData.length);
// 接收客戶端請求的數據(在接收到數據之前一直處於阻塞狀態)
datagramSocket.receive(resDatagramPacket);
// 獲取請求的數據,並轉成String打印出來
String serverData = new String(resData, 0, resDatagramPacket.getLength());
System.out.println("我是客戶端,服務端響應的數據爲:" + serverData);
datagramSocket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
然後再運行看看結果。
同樣的,我們也要先啓動客戶端,在啓動客戶端
服務端控制檯:
客戶端控制檯: