一、UDP傳輸
1.發送Send
步驟:
-
創建DatagramSocket,隨機端口號
-
創建DatagramPacket,指定數據,長度,地址,端口
-
使用DatagramSocket發送DatagramPacket
-
關閉DatagramSocket
DatagramSocket()
構造數據報套接字並將其綁定到本地主機上任何可用的端口。
DatagramSocket(int port, InetAddress laddr)
創建數據報套接字,將其綁定到指定的本地地址。
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
構造數據報包,用來將長度爲length
的包發送到指定主機上的指定端口號。
void
send(DatagramPacket p)
從此套接字發送數據報包。
public static void main(String[] args) throws Exception {
String str = "what are you 弄啥呢?";
DatagramSocket socket = new DatagramSocket(); //創建Socket相當於創建碼頭
DatagramPacket packet = //創建Packet相當於集裝箱
new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
socket.send(packet); //發貨,將數據發出去
socket.close(); //關閉碼頭
}
2.接受Receive
步驟:
- 創建DatagramSocket,指定端口號
- 創建DatagramPacket,指定數組, 長度
- 使用DatagramSocket接收DatagramPacket
- 關閉DatagramSocket
- 從DatagramPacket中獲取數據
DatagramSocket(int port)
創建數據報套接字並將其綁定到本地主機上的指定端口。
DatagramPacket(byte[] buf, int length)
構造DatagramPacket
,用來接收長度爲length
的數據包。
void
receive(DatagramPacket p)
從此套接字接收數據報包。
byte[]
getData()
返回數據緩衝區。int
getLength()
返回將要發送或接收到的數據的長度。
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(6666); //創建Socket相當於創建碼頭
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//創建Packet相當於創建集裝箱
socket.receive(packet); //接貨,接收數據
byte[] arr = packet.getData(); //獲取數據
int len = packet.getLength(); //獲取有效的字節個數
System.out.println(new String(arr,0,len));
socket.close();
}
3.接收方獲取ip和端口號
InetAddress
getAddress()
返回某臺機器的 IP 地址,此數據報將要發往該機器或者是從該機器接收到的。
int
getPort()
返回某臺遠程主機的端口號,此數據報將要發往該主機或者是從該主機接收到的。
二、UDP傳輸優化
1.發送端Send
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in); //創建鍵盤錄入對象
DatagramSocket socket = new DatagramSocket(); //創建Socket相當於創建碼頭
while(true) {
String line = sc.nextLine(); //獲取鍵盤錄入的字符串
if("quit".equals(line)) {
break;
}
DatagramPacket packet = //創建Packet相當於集裝箱
new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
socket.send(packet); //發貨,將數據發出去
}
socket.close(); //關閉碼頭
}
2.接收端Receive
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(6666); //創建Socket相當於創建碼頭
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//創建Packet相當於創建集裝箱
while(true) {
socket.receive(packet); //接貨,接收數據
byte[] arr = packet.getData(); //獲取數據
int len = packet.getLength(); //獲取有效的字節個數
String ip = packet.getAddress().getHostAddress(); //獲取ip地址
int port = packet.getPort(); //獲取端口號
System.out.println(ip + ":" + port + ":" + new String(arr,0,len));
}
}
三、UDP傳輸多線程
public class Demo3_MoreThread {
public static void main(String[] args) {
new Receive().start();
new Send().start();
}
}
class Receive extends Thread {
public void run() {
try {
DatagramSocket socket = new DatagramSocket(6666); //創建Socket相當於創建碼頭
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//創建Packet相當於創建集裝箱
while(true) {
socket.receive(packet); //接貨,接收數據
byte[] arr = packet.getData(); //獲取數據
int len = packet.getLength(); //獲取有效的字節個數
String ip = packet.getAddress().getHostAddress(); //獲取ip地址
int port = packet.getPort(); //獲取端口號
System.out.println(ip + ":" + port + ":" + new String(arr,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Send extends Thread {
public void run() {
try {
Scanner sc = new Scanner(System.in); //創建鍵盤錄入對象
DatagramSocket socket = new DatagramSocket(); //創建Socket相當於創建碼頭
while(true) {
String line = sc.nextLine(); //獲取鍵盤錄入的字符串
if("quit".equals(line)) {
break;
}
DatagramPacket packet = //創建Packet相當於集裝箱
new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
socket.send(packet); //發貨,將數據發出去
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}