UDP 协议基础介绍
协议头
UDP协议头相对简单,由4个字段组成,每个字段的长度都是固定的。UDP协议头一共占8个字节,具体结构如下:
源端口号:占2个字节,表示发送方的端口号。
目的端口号:占2个字节,表示接收方的端口号。
长度:占2个字节,表示UDP数据报的总长度(包括协议头和数据部分)。
校验和:占2个字节,用于校验UDP数据报在传输过程中是否出错。
通讯方式
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
Java 代码示例
以下是一个简单的UDP服务器和客户端的Java代码示例:
UDP服务器
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPServer {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(8888);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String msg = new String(packet.getData(), 0, packet.getLength());
System.out.println("Server received: " + msg);
socket.close();
}
}
UDP客户端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPClient {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();
String msg = "Hello, Server!";
InetAddress address = InetAddress.getByName("localhost");
DatagramPacket packet = new DatagramPacket(msg.getBytes(), msg.length(), address, 8888);
socket.send(packet);
System.out.println("Client sent: " + msg);
socket.close();
}
}
在这个例子中,服务器监听8888端口,客户端向服务器的这个端口发送消息。服务器接收到消息后,打印出接收到的内容。客户端发送完消息后,也打印出已发送的内容。