网络编程 p5 UDP编程,UDP数据报通过数据
分享于 点击 10725 次 点评:219
网络编程 p5 UDP编程,UDP数据报通过数据
UDP网络通信编程
-
基本介绍
- 类DatagramSocket和DatagramPacket实现了基于UDP协议网络程序。
- UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
- DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
- UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接送方的连接。
-
基本流程
- 核心的两个类/对象 DatagramSocket/DatagramPacket
- 建立发送端,接收端
- 建立数据包
- 调用DatagramSocket的发送和接收方法
- 关闭DatagramSocket
-
UDP网络编程原理示意图
-
注意事项
- 没有明确的服务端和客户端,演变成数据的发送端和接收端;
- 接收数据和发送数据是通过DatagramSocket对象完成的;
- 将数据封装到DatagramPacket对象/装包;
- 当接收到DatagramPacket对象,需要进行拆包,取出数据;
- DatagramSocket可以指定在哪个端口接收数据;
-
代码演示
package com.hspedu.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* @author: 86199
* @date: 2023/5/17 17:49
* @description: UDP
*/
public class UDPReceiverA {
public static void main(String[] args) throws IOException {
//1. 创建一个DatagramSocket 对象,准备在9999接收数据
DatagramSocket socket = new DatagramSocket(9999);
//2. 构建一个DatagramPacket对象,用来接收数据
// UDP,一个数据包最大64K
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
//3. 调用接受方法,将通过网络传输的 DatagramPacket 对象填充到packet对象
// 注意:当有数据发送到 本机的9999端口时,就会接收到数据
// 如果没有数据包发送到 本机的9999端口,就会阻塞等待
System.out.println("接收端A 等待接收数据……");
socket.receive(packet);
int length = packet.getLength();
byte[] data = packet.getData();
String s = new String(data, 0, length);
System.out.println(s);
//a端作发送端
byte[] data2 = "好的,明天见".getBytes();
DatagramPacket packet1 =
new DatagramPacket(data2, data2.length, InetAddress.getByName("10.15.205.153"), 9998);
socket.send(packet1);
//关闭资源
socket.close();
System.out.println("A端退出...");
}
}
package com.hspedu.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* @author: 86199
* @date: 2023/5/17 17:50
* @description: UDP
*/
public class UDPSenderB {
public static void main(String[] args) throws IOException {
//1. 创建 DatagramSocket 对象,准备在9998端口 发送数据
DatagramSocket socket = new DatagramSocket(9998);
//2. 将需要发送的数据,封装到 DatagramPacket对象
byte[] data = "hello,明天去吃火锅吧".getBytes();
//说明:封装 DatagramPacket对象 data 内容字节数组,data.length,主机(IP),端口
DatagramPacket packet =
new DatagramPacket(data, data.length, InetAddress.getByName("10.15.205.153"), 9999);
socket.send(packet);
//B端作接收端
byte[] bytes = new byte[1024];
DatagramPacket packet1 = new DatagramPacket(bytes, bytes.length);
System.out.println("接收端B 等待接收数据……");
socket.receive(packet1);
int length = packet1.getLength();
byte[] data1 = packet1.getData();
String s = new String(data1, 0, length);
System.out.println(s);
//关闭资源
socket.close();
System.out.println("B端退出...");
}
}
基本介绍
- 类DatagramSocket和DatagramPacket实现了基于UDP协议网络程序。
- UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
- DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
- UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接送方的连接。
基本流程
- 核心的两个类/对象 DatagramSocket/DatagramPacket
- 建立发送端,接收端
- 建立数据包
- 调用DatagramSocket的发送和接收方法
- 关闭DatagramSocket
UDP网络编程原理示意图
注意事项
- 没有明确的服务端和客户端,演变成数据的发送端和接收端;
- 接收数据和发送数据是通过DatagramSocket对象完成的;
- 将数据封装到DatagramPacket对象/装包;
- 当接收到DatagramPacket对象,需要进行拆包,取出数据;
- DatagramSocket可以指定在哪个端口接收数据;
代码演示
package com.hspedu.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* @author: 86199
* @date: 2023/5/17 17:49
* @description: UDP
*/
public class UDPReceiverA {
public static void main(String[] args) throws IOException {
//1. 创建一个DatagramSocket 对象,准备在9999接收数据
DatagramSocket socket = new DatagramSocket(9999);
//2. 构建一个DatagramPacket对象,用来接收数据
// UDP,一个数据包最大64K
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
//3. 调用接受方法,将通过网络传输的 DatagramPacket 对象填充到packet对象
// 注意:当有数据发送到 本机的9999端口时,就会接收到数据
// 如果没有数据包发送到 本机的9999端口,就会阻塞等待
System.out.println("接收端A 等待接收数据……");
socket.receive(packet);
int length = packet.getLength();
byte[] data = packet.getData();
String s = new String(data, 0, length);
System.out.println(s);
//a端作发送端
byte[] data2 = "好的,明天见".getBytes();
DatagramPacket packet1 =
new DatagramPacket(data2, data2.length, InetAddress.getByName("10.15.205.153"), 9998);
socket.send(packet1);
//关闭资源
socket.close();
System.out.println("A端退出...");
}
}
package com.hspedu.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* @author: 86199
* @date: 2023/5/17 17:50
* @description: UDP
*/
public class UDPSenderB {
public static void main(String[] args) throws IOException {
//1. 创建 DatagramSocket 对象,准备在9998端口 发送数据
DatagramSocket socket = new DatagramSocket(9998);
//2. 将需要发送的数据,封装到 DatagramPacket对象
byte[] data = "hello,明天去吃火锅吧".getBytes();
//说明:封装 DatagramPacket对象 data 内容字节数组,data.length,主机(IP),端口
DatagramPacket packet =
new DatagramPacket(data, data.length, InetAddress.getByName("10.15.205.153"), 9999);
socket.send(packet);
//B端作接收端
byte[] bytes = new byte[1024];
DatagramPacket packet1 = new DatagramPacket(bytes, bytes.length);
System.out.println("接收端B 等待接收数据……");
socket.receive(packet1);
int length = packet1.getLength();
byte[] data1 = packet1.getData();
String s = new String(data1, 0, length);
System.out.println(s);
//关闭资源
socket.close();
System.out.println("B端退出...");
}
}
用户点评