UDP协议
1.UDP使用场景
-
域名系统
若是执行时间内,没有响应返回,证明包已丢失。
-
音频或视频
数据包的丢失只会造成通话或视频的干扰和不清楚,而不会像TCP协议那样造成通话的丢失或卡顿。
2.UDP和TCP的类比
UDP类似于邮局,数据的接受与否和到达顺序,邮局是不可控的。但是可以通过数据报的数据,预先协商好协议,达到对数据顺序和数据完整性的控制。
TCP类似于电话,通话的应答和响应是可控的。
3.UDP的传输形式和TCP的对比
UDP是以数据包的形式,而TCP中是通过流的形式传输。
UDP客户端
1.创建客户端的步骤
1、首先打开一个Socket连接
//客户端使用随机端口
DatagramSocket socket = new DatagramSocket(0);
2、设置一个连接超时时间
//UDP是无连接的网络协议,不设置超时时间,即使远程主机未在端口监听,你也永远接收不到回音
socket.setTimeOut(10000);
3、建立数据包,一个发送数据包,一个接收数据包
//发送数据包
InetAddress host = InetAddress.getByName("www.baiud.com");
DatagramPacket request = new DatagramPacket(new byte[1],1,host,9999);
//接收数据包
Byte byte = new Byte[1024];
DatagramPacket response = DatagramPacket(byte,byte.length);
socket.send(request);
socket.receive(response);
//注 java7中,DatagramSocket实现了AutoCloseablem,所以声明socket时,可以使用 try-with-resources
try(DatagramSocket socket = new DatagramSocket(0)){
//连接到服务器
}catch(IOException ex){
Sysstem.err.println("Could not connect to ......")
}
2.示例
UDP服务器
1.与TCP的不同
模式与客户端相同,不过在发送之前要先接收,而且不会选择要绑定的匿名接口。与TCP不同,并没有单独的DatagramServerSocket类
2.创建注意事项
1、创建一个接收数据的请求包
DatagramPacket request = new DatagramPacket(new byte[1024],0,1024);
//这个调用会无限阻塞
scoket.receive(request);
2、创建一个响应包
//响应包的声明规范对于服务器属性是关联的,此处的响应包需要指明响应的地址和端口
DatagramPacket response = new DatagramPacket(new byte[1],1,host,9999);
3.示例
DatagramPacket类
1、组成
UDP数据包是基于IP数据报建立的,只向其底层IP数据报添加了很少的一点内容。
向IP数据报首部添加了8字节。
UDP首部包括源和目标端口号、IP首部之后所有内容的长度,以及一个可选的校验和。
端口号以2字节无符号整数给出,主机有65536个不同的UDP端口号可以使用,与每台主机的65536个不同的TCP端口截然不同。
因此,数据包中的字节数不能超过65536减去首部的8个字节。
校验和字段是可选的,应用层程序不适用这个校验和,如果数据的校验和失败,那么底层网络软件会丢弃这个数据报,发送方和接收方都不会收到通知。毕竟,UDP是不可靠的协议。
2、UDP数据报长度
1、理论最大值
65507字节
2、实际限制
8192字节 8KB
3、为保证最大的安全性
512字节或更少
注意 TCP
TCP数据报也存在这个问题,但Socket和ServerScoket提供的是基于流的API,因此对程序员隐藏了这些细节。
3、DatagramPacket 类
只提供了获取和设置IP首部中源或目标地址、获取和设置源或目标端口、获取和设置数据、以及获取和设置数据长度。其余首部字段无法通过java代码访问。
1、构造函数
1、接收数据报的构造函数
2、发送数据报的构造函数