UDP是什么
UDP-User Datagram Protocol,一种用户数据报协议,又称用户数据报文协议,是基于面向报文的协议,而不是面向连接。
实际上,UDP协议只实现了两个功能:
- 在IP协议的基础上添加了端口
- 对传输过程中可能产生的数据错误进行了检测,并抛弃已经损坏的数据
为什么UDP不可靠
UDP只负责发送数据,一旦把应用程序发给网络层的数据发送出去,就不保留数据备份。UDP在IP数据报的头部仅仅加入了复用和数据校验字段。UDP不面向连接,发送端生产数据,接收端在网络中抓取数据,发送端与接收端之间不需要连,容易掉包。
UDP核心API
Java通过DatagramPacket类和DatagramSocket类来使用套接字,客户端和服务器端都通过DatagramSocket的send()方法和receiver()方法来发送和接受数据,用DatagramPacket来包装需要发送或者接收的数据。
- 发送信息时,Java 创建一个包含待发送信息的 DatagramPacket 实例,并将其作为参数传递给DatagramSocket实例的send()方法;
- 接收信息时,Java 程序首先创建一个 DatagramPacket 实例,该实例预先分配了一些空间,并将接收到的信息存放在该空间中,然后把该实例作为参数传递给 DatagramSocket 实例的 receive()方法
如果该实例用来包装待接收的数据,则不指定数据来源的远程主机和端口,只需指定一个缓存数据的 byte 数组即可(在调用 receive()方法接收到数据后,源地址和端口等信息会自动包含在 DatagramPacket 实例中),而如果该实例用来包装待发送的数据,则要指定要发送到的目的主机和端口
DatagramSocket
- 用于接收与发送UDP的类
- 负责发送某一个UDP包,或者接收UDP包
- 不同TCP,UDP并没有合并到Socket API中
构造方法
//创建简单实例,不指定端口与IP,自动使用空闲的端口
DatagramSocket()
//创建监听端口的实例,这里指定的端口仅仅用来接收数据,而发送数据时并不一定会发送该端口
DatagramSocket(int port)
//创建固定IP与端口的实例
DatagramSocket(int port,InetAddress localAddr)
//发送数据
send(DatagramPacket p)
//接收数据
receive(DatagramPacket p)
//设置超时时间,单位为毫秒
setSoTimeout(int timeout)
//关闭。释放资源
close()
DatagramSocket
用于处理报文,将byte数组,目标地址,目标端口等数据包装成报文或者将报文拆卸成byte数组,是UDP的发送实体,也是接收实体
构造方法
//前面三个参数指定buf的使用区间
//后面两个参数指定目标机器地址与端口
//这里port仅在发送时有效,接收时无效,接收时的port是通过系统完成指定的。
public DatagramPacket(byte buf[], int offset, int length,
InetAddress address, int port) {
setData(buf, offset, length);
setAddress(address);
setPort(port);
}
//SocketAddress=InetAddress+port
public DatagramPacket(byte buf[], int offset, int length, SocketAddress address