目录
1、UDP 的定义
2、UDP 编程的两个实现类
3、UDP 编程实现发送端和接收端相互通信(模拟QQ)
1、UDP 的定义
提供面向事务的简单不可靠信息传送服务。Java 主要提供了两个类来实现基于 UDP 的 Socket 编程。
2、UDP 编程的两个实现类
DatagramSocket.class:此类表示用来发送和接收数据报包的套接字。数据报套接字是包投递服务的发送或接收点,每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。在 DatagramSocket 上总是启用 UDP 广播发送。
DatagramPacket.class:此类表示数据报包,它用来实现无连接的包投递服务。DatagramPacket 会根据该包中包含的地址和端口等信息,将报文从一台机器路由到另一台机器。
DatagramPacket 类主要有两个构造函数:
- 一个用来接收数据
- 另一个用来发送数据 DatagramPacket(byte buf[], int length, InetAddress address, int port),建立将要传输的 UDP 包,并指定 ip 地址和端口号。
3、UDP 编程实现发送端和接收端相互通信(模拟QQ)
接收端代码的具体实现:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class UdpRecv {
/**
* 中断标记
*/
public static final String QUIT = "quit";
public static void main(String[] args) throws Exception {
// 创建套接字
DatagramSocket ds = new DatagramSocket(3000);
byte[] buf = new byte[1024];
while (true) {
// 创建接收消息数据包
DatagramPacket recive = new DatagramPacket(buf, 1024);
// 接收消息,如果没有消息,进入阻塞状态
ds.receive(recive);
String strRecv = new String(recive.getData(), 0, recive.getLength()) +
" from " + recive.getAddress().getHostAddress() + ":" + recive.getPort();
// 打印接收到的消息
System.out.println(strRecv);
System.out.println("请输入:");
Scanner sc = new Scanner(System.in);
String next = sc.next();
if (next.equals(QUIT)) {
ds.close();
System.out.println("程序退出...");
break;
}
// 创建发送消息数据包
DatagramPacket send = new DatagramPacket(next.getBytes(), next.length(),
InetAddress.getByName("127.0.0.1"), recive.getPort());
// 发送消息
ds.send(send);
System.out.println("消息已经发送...");
}
}
}
发送端的具体代码实现:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class UdpSend {
public static final String QUIT = "quit";
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket();
byte[] buf = new byte[1024];
while (true) {
System.out.println("请输入:");
Scanner sc = new Scanner(System.in);
String next = sc.next();
if (next.equals(QUIT)) {
// 发送通知退出消息
DatagramPacket send = new DatagramPacket(next.getBytes(), next.length(),
InetAddress.getByName("127.0.0.1"), 3000);
ds.send(send);
ds.close();
System.out.println("程序退出...");
break;
}
// 发送消息数据包
DatagramPacket send = new DatagramPacket(next.getBytes(), next.length(),
InetAddress.getByName("127.0.0.1"), 3000);
// 发送消息
ds.send(send);
System.out.println("消息已经发送...");
// 接收消息数据包
DatagramPacket recive = new DatagramPacket(buf, 1024);
// 接收消息
ds.receive(recive);
String strRecv = new String(recive.getData(), 0, recive.getLength()) +
" from " + send.getAddress().getHostAddress() + ":" + recive.getPort();
System.out.println(strRecv);
}
}
}
分别单独运行以上程序,通信效果演示如下,发送端消息:
接收端消息:
至此基于 UDP 的 socket 编程的简要介绍结束。