一、UDP协议简介
UDP(UserDatagramProtocol)是一个简单的面向消息的传输层协议,尽管UDP提供标头和有效负载的完整性验证(通过校验和),但它不保证向上层协议提供消息传递,并且UDP层在发送后不会保留UDP 消息的状态。因此,UDP有时被称为不可靠的数据报协议。如果需要传输可靠性,则必须在用户应用程序中实现。
- UDP是基于IP的简单协议,不可靠的协议。
- UDP的优点:简单,轻量化。
- UDP的缺点:没有流控制,没有应答确认机制,不能解决丢包、重发、错序问题。
综上所述,UDP使用场景为流媒体应用、语音交流、视频会议所使用的传输层协议,还有许多基于互联网的电话服务使用的VOIP(基于IP的语音)也是基于UDP运行的,实时视频和音频流协议旨在处理偶尔丢失的数据包,因此,如果重新传输丢失的数据包,则只会发生质量略有下降,而不是出现较大的延迟。
二、DatagramSocket 类
DatagramSocket 类用于表示发送和接收数据报包的套接字。数据报包套接字是包投递服务的发送或接收点。每个在数据报包套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
一 、构造方法
(1)DatagramSocket() 绑定到本地地址和一个随机的端口号
(2)DatagramSocket(int port) 绑定本地地址和一个特定的端口号
(3)DatagramSocket(int port, InetAddress iad) 绑定到特定的端口号及指定地址
(4)DatagramSocket(SocketAddress sad) 绑定指定地址和随机端口号
二、基本方法
(1)close() 关闭套接字
(2)recevie(DatagramPacket dp) 接受数据报
(3)send(DatagramPacket dp) 发送数据报
三、DatagramPacket 类
java.net 包中的 DatagramPacket 类用来表示数据报包,数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
一、接受类型
(1)DatagramPacket(byte[] buf, int length) 用来接受长度为length的buf数据(即数据存于字节数组buf中)
二、发送类型
(1)DatagramPacket(byte[] buf, int length, InetAddress address, int port) 将length长的buf数据发送到指定的地址的端口号处
(2)DatagramPacket(byte[] buf, int length, SocketAddress address) 将length长的buf数据发送到指定的套接字地址处
四、代码示例
1、一个发送方,一个接收方 2、先运行接收方,再运行发送方
UdpReceive
public class UdpReceive {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(1111);
DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
datagramSocket.receive(datagramPacket);
byte[] arr = datagramPacket.getData();
int len = datagramPacket.getLength();
System.out.println(new String(arr, 0, len));
datagramSocket.close();
}
}
UdpSend
public class UdpSend {
public static void main(String[] args) throws IOException {
String str = "法国的欢呼雀跃掩映着一个人的寂寥无言,梅西就这样孤独地站在原地,空空如也,满泪哀伤,仿佛是上天的安排,"
+ "在梅西告别世界杯的同一天,C罗也在这一天挥手再见,卡瓦尼用两粒精彩绝伦的进球终结了C罗的世界杯之梦,绝代双骄,同天告别,"
+ "这是猝不及防却必须承受的生命之重,31岁的梅西,33岁的C罗,他们真的已不再年轻,这一天,时光好像悄悄拉上了一代人青春的大幕,"
+ "无人知晓,最好的他们会否在四年之后等在下一个重逢的路口。人生里有这样一首诗:当我们拥有他时,还无法读懂,当我们读懂他时,"
+ "他却已悄然远走,这首诗,就是青春!惟愿岁月在匆匆无情中对他们写尽温柔,惟愿时光在飘飘风雨里让他们依旧坚守,"
+ "此时,讲不出再见,此刻,诉不尽离愁,一壶浊酒尽余欢,今宵别梦寒!";
DatagramSocket datagramSocket = new DatagramSocket();
DatagramPacket datagramPacket = new DatagramPacket(str.getBytes(),
str.getBytes().length, InetAddress.getByName("127.0.0.1"), 1111);
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
}
|