UDP协议通信
UDP中文名是用户数据报协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
基于UDP通信的基本模式是:将数据打包成数据包,将数据包发往目的地,接收数据包并查看数据包中的内容。
每个数据包包含:自己的IP和程序端口、目的的IP和程序端口、数据(限制在64KB内)等。
由于UDP通信是一种无连接、不可靠的通信,一般适用于对通信效率要求较高、不要求传输完整性的通信,如音频和多媒体应用、视频直播、语音通话等。
Java中的实现类
Java中提供了一个java.net.DatagramSocket类来实现UDP通信的客户端和服务端,用java.net.DatagramPacket类实现UDP数据包。
UDP套接字
1. 常用构造方法
构造方法 | 说明 |
---|---|
DatagramSocket() | 在本地主机创建UDP套接字对象,系统会随机分配一个端口号,常用作构造客户端 |
DatagramSocket(int port) | 在本地主机创建UDP套接字对象,并指定一个端口号,常用作构造服务端 |
DatagramSocket(int port, InetAddress laddr) | 在指定主机地址创建UDP套接字,并指定一个端口号 |
2. 常用成员方法
成员方法 | 说明 |
---|---|
void send(DatagramPacket p) | 发送数据包 |
void receive(DatagramPacket p) | 接收数据包 |
void close() | 关闭此UDP套接字 |
UDP数据包
1. 常用构造方法
构造方法 | 说明 |
---|---|
DatagramPacket(byte[] buf, int length) | 创建一个用来接收的数据包对象 |
DatagramPacket(byte[] buf, int length, InetAddress address, int port) | 创建一个用来发送的数据包对象,指定数据、长度、目的ip地址和端口号 |
2. 常用成员方法
成员方法 | 说明 |
---|---|
void getLength() | 返回要发送或接收到的数据的长度 |
SocketAddress getSocketAddress() | 返回要发送数据的目的套接字或接收到数据的来源套接字 |
简单应用代码
// Server.java
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Server {
public static void main(String[] args) {
System.out.println("服务端已打开");
try(DatagramSocket socket = new DatagramSocket(8888)) {
//DatagramSocket实现了Closeable接口,在try()内可以自动关闭
byte[] buffer = new byte[1024*64];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while(true) { //服务器一般不会主动停止运行,不设置结束条件
socket.receive(packet);
String s = new String(buffer, 0, packet.getLength());//转化为字符串
System.out.println(s);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
// Client.java
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
System.out.println("客户端已打开");
try(DatagramSocket socket = new DatagramSocket()) {
Scanner scanner = new Scanner(System.in);
while(true){
String msg = scanner.nextLine();
if("exit".equals(msg)){
break;
}
byte[] bytes = msg.getBytes();
DatagramPacket packet = new DatagramPacket(bytes, bytes.length,
InetAddress.getLocalHost(), 8888);
//使用InetAddress.getLocalHost()在本地主机进行模拟
socket.send(packet);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
System.out.println("客户端发送完毕");
}
}