title: UDP
date: 2021-06-07 22:42:01
tags: NET
categories: Java
description:
top_img:
comments:
cover:
UDP
基本介紹
DatagramSocket有兩種常用的構造函數。一種是無需任何參數的,常用於客戶端;另一種需要指定端口,常用於服務器端。如下所示:
DatagramSocket() :構造數據報套接字並將其綁定到本地主機上任何可用的端口。
DatagramSocket(int port) :創建數據報套接字並將其綁定到本地主機上的指定端口。
常用方法:
Ø send(DatagramPacket p) :從此套接字發送數據報包。
Ø receive(DatagramPacket p) :從此套接字接收數據報包。
Ø close() :關閉此數據報套接字。
Ø DatagramPacket(byte[] buf, int length) :構造數據報包,用來接收長度為 length 的數據包。
Ø DatagramPacket(byte[] buf, int length, InetAddress address, int port) :構造數據報包,用來將長度為 length 的包發送到指定主機上的指定端口號。
Ø getAddress() :獲取發送或接收方計算機的IP地址,此數據報將要發往該機器或者是從該機器接收到的。
Ø getData() :獲取發送或接收的數據。
Ø setData(byte[] buf) :設置發送的數據。
UDP通信編程基本步驟
1. 創建客戶端的DatagramSocket,創建時,定義客戶端的監聽端口。
-
創建服務器端的DatagramSocket,創建時,定義服務器端的監聽端口。
-
在服務器端定義DatagramPacket對象,封裝待發送的數據包。
-
客戶端將數據報包發送出去。
-
服務器端接收數據報包。
UDP實例
UDP Client
// 1、使用DatagramSocket指定端口創建發送端
DatagramSocket clientSocket = new DatagramSocket(9999);
//2、准備數據-定轉成字節數組
String data = "案發時官方";
byte[] datas = data.getBytes("utf-8");
//3. 封裝成DatagramPacket包裹,需要指定目的地
DatagramPacket dataPacket = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",8888));
//4、 發送包裹send(DatagramPacket p)
clientSocket.send(dataPacket);
// 5.釋放資源
clientSocket.close();
UDP Server
// 1、使用DatagramSocket指定端口創建接收端
DatagramSocket serviceSocket = new DatagramSocket(8888);
//2、准備容器封裝成DatagramPacket包裹
byte[] container = new byte[1024*60];
DatagramPacket dataPacket = new DatagramPacket(container,0,container.length);
// 3、阻塞式接收包裹receive(DatagramPacket p)
serviceSocket.receive(dataPacket);
//4、分析數據
// byte[] getData(
// getLength(
byte[] datas = dataPacket.getData();
int len = dataPacket.getLength();
System.out.println(new String(datas,0,len));
//5釋放資源
serviceSocket.close();
UDP File Client
// 1、使用DatagramSocket指定端口創建發送端
DatagramSocket clientSocket = new DatagramSocket(9999);
//2、准備數據-定轉成字節數組
String data = "案發時官方";
byte[] datas = data.getBytes("utf-8");
//3. 封裝成DatagramPacket包裹,需要指定目的地
DatagramPacket dataPacket = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",8888));
//4、 發送包裹send(DatagramPacket p)
clientSocket.send(dataPacket);
// 5.釋放資源
clientSocket.close();
UDP File Server
// 1、使用DatagramSocket指定端口創建接收端
DatagramSocket serviceSocket = new DatagramSocket(8888);
//2、准備容器封裝成DatagramPacket包裹
byte[] container = new byte[1024*60];
DatagramPacket dataPacket = new DatagramPacket(container,0,container.length);
// 3、阻塞式接收包裹receive(DatagramPacket p)
serviceSocket.receive(dataPacket);
//4、分析數據
// byte[] getData(
// getLength(
byte[] datas = dataPacket.getData();
int len = dataPacket.getLength();
//5釋放資源
serviceSocket.close();
UDP Object Client
// 1、使用DatagramSocket指定端口創建發送端
DatagramSocket clientSocket = new DatagramSocket(8888);
//2、准備數據-定轉成字節數組
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(byteArrayOutputStream));
oos.writeUTF("啦啦啦啦");
People people = new People();
people.setName("aaaa");
people.setAge(18);
oos.writeObject(people);
oos.flush();
byte[] bytes = byteArrayOutputStream.toByteArray();
//3. 封裝成DatagramPacket包裹,需要指定目的地
DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress("localhost", 9999));
//4、 發送包裹send(DatagramPacket p)
clientSocket.send(packet);
// 5.釋放資源
clientSocket.close();
UDP Object Server
// 1、使用DatagramSocket指定端口創建接收端
DatagramSocket serverSocket = new DatagramSocket(9999);
//2、准備容器封裝成DatagramPacket包裹
byte[] container = new byte[1024*60];
DatagramPacket packet = new DatagramPacket(container, 0, container.length);
// 3、阻塞式接收包裹receive(DatagramPacket p)
serverSocket.receive(packet);
//4、分析數據
// byte[] getData(
// getLength(
byte[] data = packet.getData();
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new ByteArrayInputStream(data)));
Object str = ois.readUTF();
Object sb = ois.readObject();
if (str instanceof String){
String a = (String)str;
System.out.println("String:"+a);
}
if (sb instanceof People){
People a = (People)sb;
System.out.println("年齡:"+a.getAge());
}
//5釋放資源
serverSocket.close();
UDP Talk Client
// 1、使用DatagramSocket指定端口創建發送端
DatagramSocket clientSocket = new DatagramSocket(9999);
//2、准備數據-定轉成字節數組
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
while (true){
String data = bufferedReader.readLine();
byte[] datas = data.getBytes("utf-8");
//3. 封裝成DatagramPacket包裹,需要指定目的地
DatagramPacket dataPacket = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",8888));
//4、 發送包裹send(DatagramPacket p)
clientSocket.send(dataPacket);
if (data.equalsIgnoreCase("exit")){
break;
}
}
// 5.釋放資源
clientSocket.close();
UDP Talk Server
// 1、使用DatagramSocket指定端口創建接收端
DatagramSocket serverSocket = new DatagramSocket(8888);
//2、准備容器封裝成DatagramPacket包裹
while (true){
byte[] container = new byte[1024*60];
DatagramPacket dataPacket = new DatagramPacket(container,0,container.length);
// 3、阻塞式接收包裹receive(DatagramPacket p)
serverSocket.receive(dataPacket);
//4、分析數據
// byte[] getData(
// getLength(
byte[] datas = dataPacket.getData();
int len = dataPacket.getLength();
String da = new String(datas,0,len);
System.out.println(da);
if (da.equalsIgnoreCase("exit")){
break;
}
}
//5釋放資源
serverSocket.close();
Tread UDP
public class ClientStudent { public static void main(String[] args) { new Thread(new TalkSend(7777,"localhost",6666)).start(); new Thread(new TalkRecive(9999)).start(); }}-----------------------------------------------------------------------------------------------------public class ClientTeacher { public static void main(String[] args) { new Thread(new TalkSend(8888,"localhost",9999)).start(); new Thread(new TalkRecive(6666)).start(); }}-----------------------------------------------------------------------------------------------------public class TalkRecive implements Runnable { private DatagramSocket serverSocket; public TalkRecive(int port){ try { serverSocket = new DatagramSocket(port); } catch (SocketException e) { e.printStackTrace(); } } @Override public void run() { while (true){ byte[] container = new byte[1024*60]; DatagramPacket dataPacket = new DatagramPacket(container,0,container.length); // 3、阻塞式接收包裹receive(DatagramPacket p) try { serverSocket.receive(dataPacket); //4、分析數據 // byte[] getData( // getLength( byte[] datas = dataPacket.getData(); int len = dataPacket.getLength(); String da = new String(datas,0,len); System.out.println(da); if (da.equalsIgnoreCase("exit")){ break; } } catch (IOException e) { e.printStackTrace(); } } serverSocket.close(); }}-----------------------------------------------------------------------------------------------------public class TalkSend implements Runnable { private DatagramSocket clientSocket; private BufferedReader bufferedReader; private String toIP; private int toPort; public TalkSend(int Port,String toIP,int toPort){ this.toIP = toIP; this.toPort = toPort; try { clientSocket = new DatagramSocket(Port); bufferedReader = new BufferedReader(new InputStreamReader(System.in)); } catch (SocketException e) { e.printStackTrace(); } } @Override public void run() { while (true){ String data = null; try { data = bufferedReader.readLine(); byte[] datas = data.getBytes("utf-8"); //3. 封裝成DatagramPacket包裹,需要指定目的地 DatagramPacket dataPacket = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIP,this.toPort)); //4、 發送包裹send(DatagramPacket p) clientSocket.send(dataPacket); if (data.equalsIgnoreCase("exit")){ break; } } catch (IOException e) { e.printStackTrace(); } } clientSocket.close(); }}