概念
User Datagram Protocol的简称,用户数据报协议,提供面向事务的简单不可靠信息传送服务。
特点
- 将数据封装成一个数据包,面向无连接. 如同广播站 和 收音机的关系
- 每一个数据包大小限制在64kb以内
- 因为面向无连接,不可靠, 会丢包
- 因为面向无连接,所以传输 速度特别快!!!
- UDP不区分客户端和服务器,只有发送端和接收端
- 网络游戏/网络直播均采用UDP协议、
相关方法
UDP的发送和接收需要数据包,就跟快递一样,需要将物品打包,所以,对于发送端,必须明确包的内容和容量,以及接收端的具体地址和端口号;而对于接收端,只需要建立端口号的连接,并准备好相应容量的包进行接收即可,因为数据包本身就包含有发送端的信息。
构造方法
//创建DatagramSocket,UDP的套接字,连接作用
DatagramSocket ds = new DatagramSocket();
DatagramSocket ds = new DatagramSocket(int port);
//创建数据包,【数据包里面包含后发送端的信息】
DatagramPacket packet = DatagramPacket(byte buf[], int length);
DatagramPacket packet = DatagramPacket(byte buf[], int length, InetAddress address, int port);
普通方法
//发送报包
ds.send(packet);
//接收报包,具有阻塞功能
ds.receive(packet);
接收端和发送端的简单信息交互基本流程
发送端
- 创建DatagramSocket
- 创建数据报包,明确接收端的ip和port
- 发送报包
- 接收报包
- 处理报包
- 关闭
接收端
- 创建DatagramSocket,提供端口号
- 创建数据报包
- 接收(阻塞方法)
- 处理数据
- 回复【注意回复的时候必须使用接收到的数据包获取对应发送方的Ip和port】
- 关闭
代码实现
//发送端
public class Sender {
public static void main(String[] args) throws IOException {
//1.创建DatagramSocket
DatagramSocket ds = new DatagramSocket();
//2.创建数据报包
String say = "好久不见";
//明确接收方的详细信息,IP和Port
DatagramPacket packet = new DatagramPacket(say.getBytes(), say.getBytes().length, InetAddress.getLocalHost(),9990);
//3.发送报包
ds.send(packet);
//4.接收
byte[] buf = new byte[1024 * 8];
DatagramPacket packet1 = new DatagramPacket(buf, buf.length);
ds.receive(packet1);
//5.处理
String str = new String(buf, 0, buf.length);
System.out.println("对方说:" + str);
//6.关闭
ds.close();
}
}
//接收端
public class Receiver {
public static void main(String[] args) throws IOException {
//1.创建DatagramSocket
DatagramSocket ds = new DatagramSocket(9990);
//2.创建数据报包
byte[] buf = new byte[1024 * 8];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
//3.接收(阻塞方法)
System.out.println("准备接收");
ds.receive(packet); //接收包中有对方的地址
//4.处理数据
String data = new String(buf, 0, buf.length);
System.out.println("对方说:" + data);
//5.回复
String data1 = "十分想念";
//通过数据报包获取发送方的详细信息,IP和Port
DatagramPacket packet1 = new DatagramPacket(data1.getBytes(), data1.getBytes().length, packet.getAddress(), packet.getPort());
ds.send(packet1);
//6.关闭
ds.close();
}
}