UDP 简称 User Datagram Protocol (用户数据报协议),是一种无连接、不可靠的协议,每个数据报都是一个独立的信息,每个被传输的数据报很小(限定在 64k 以下),位于传输层 ( ip 位于网络层 ) 。而且 UDP 协议是不分客户端和服务端,只分发送端和接收端。因为 UDP 协议是面向无连接的,所以速度很快,但会出现数据包丢失。一般用于视频聊天、网络游戏等实时性较高的情况。
简单的 UDP 程序
发送者
public class UdpSender {
public static void main(String[] args) throws IOException {
//首先创建一个DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
//创建一个InetAddree
InetAddress serverAddress = InetAddress.getByName("127.0.0.1");
String str = "Hello World!"; //这是要传输的数据
byte data[] = str.getBytes(); //把传输内容分解成字节
//创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个、地址,以及端口号
DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress, 4567);
//调用socket对象的send方法,发送数据
socket.send(packet);
}
}
接收者
public class UdpReceiver {
public static void main(String[] args) throws IOException {
//创建一个DatagramSocket对象,并指定监听的端口号
DatagramSocket socket = new DatagramSocket(4567);
while (true) {
//如果发送过来的数据大于1024字节,那么将接收不完整
byte data[] = new byte[1024];
//创建一个空的DatagramPacket对象
DatagramPacket packet = new DatagramPacket(data, data.length);
//使用receive方法接收客户端所发送的数据,
//如果客户端没有发送数据,该进程就停滞在这里
socket.receive(packet);
String result = new String(packet.getData(), packet.getOffset(), packet.getLength());
System.out.println(packet.getAddress().getHostName() + " result---> " + result);
}
}
}
丢包的原因
带宽不足
cpu 处理不过来
传输层和网络层有什么不同
网络层: 提供点到点的连接,即提供主机之间的逻辑通信。 传输层: 提供端到端的连接,即进程之间的逻辑通信。