目录
UDP网络编程
基本介绍:
- 类 DatagramSocket 和 类 DatagramPacket(数据报/数据包) 实现了基于UDP协议的网络程序
- UDP数据报通过数据报套接字DatagramSocket 发送和接收,系统不保证UDP数据报一定能安全的送到目的地,也不能确定什么时候可以抵达。
- DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的ip地址和端口号以及接收端的ip地址和端口号。
- UDP协议中每个数据报都给出了完整的地址信息,因此无需建立发送方和接收方的连接。
UDP网络编程原理示意图
UDP说明:
- 没有明确的客户端和服务端,演变成数据发送端和数据接收端
- 接收和发送数据是通过 DatagramSocket 对象完成。
- 将数据封装到 DatagramPacket对象中(装包)
- 接收到DatagramPacket对象,需要进行拆包,取出数据
- DatagramSocket可以指定在那个端口接收数据
基本流程:
- 核心的两个类 DatagramSocket和DatagramPacket
- 建立发送端和接收端(没有服务端和客户端的概念)
- 发送数据前,建立数据包的对象
- 调用DatagramSocket的发送接收方法
- 关闭DatagramSocket
案例:通过UDP协议实现收发信息
接收端A代码实现
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;
public class UDPReceiverA {
public static void main(String[] args) throws IOException {
//创建DatagramSocket对象,准备在9999端口接收和发送数据
DatagramSocket datagramSocket = new DatagramSocket(9999);
byte[] bytes = new byte[1024];
//创建数据报对象,将bytes数组传入,准备接收数据
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
System.out.println("等待发送数据...");
//将接收到的数据放入数据报中,如果没有数据发过来,则阻塞,否则继续执行
datagramSocket.receive(datagramPacket);
//获取数据存入data数组
byte[] data = datagramPacket.getData();
//获取数据的长度
int length = datagramPacket.getLength();
//将数据放入字符串并显示
String s = new String(data, 0, length);
System.out.println(s);
//将要发送的数据以byte数组形式存入
byte[] bytes1 = "hi".getBytes(StandardCharsets.UTF_8);
//放入数据报中
DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, bytes1.length, InetAddress.getByName("192.168.56.1"), 9998);
//发送
datagramSocket.send(datagramPacket1);
System.out.println("发送了hi");
//关闭资源
datagramSocket.close();
System.out.println("exit...");
}
}
发送端B代码实现:
import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
public class UDPSenderB {
public static void main(String[] args) throws IOException {
//创建DatagramSocket对象,准备在9998端口接收和发送数据
DatagramSocket datagramSocket = new DatagramSocket(9998);
//将数据存入byte数组中
byte[] information = "hello".getBytes(StandardCharsets.UTF_8);
//创建数据报对象,将放入数据,数据长度,接收端ip,接收端端口
DatagramPacket datagramPacket = new DatagramPacket(information, information.length, InetAddress.getByName("192.168.56.1"), 9999);
//发送数据
datagramSocket.send(datagramPacket);
System.out.println("发送了:hello");
//接收数据,同UDPReceiverA类接收数据
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket1 = new DatagramPacket(bytes, bytes.length);
datagramSocket.receive(datagramPacket1);
int length = datagramPacket1.getLength();
byte[] data = datagramPacket1.getData();
String s = new String(data, 0, length);
System.out.println(s);
//关闭资源
datagramSocket.close();
System.out.println("exit...");
}
}
结果:
- 开启接收端A:
等待发送数据...
- 开启发送端B:
-
- 发送端B:
发送了:hello
hi
exit...
-
- 接收端A:
等待发送数据...
hello
发送了hi
exit...