目录
一、认识相关API
1)DatagramSocket
2)DatagramPacket
3)InetSocketAddress
二、UDP数据报套接字通信模型概述
三、回显客户端-服务器通信
1)服务器代码
2)客户端代码
一、认识相关API
1)DatagramSocket
DatagramSocket 常用构造方法 |
DatagramSocket() | 创建UDP数据报Scoket套接字,绑定本机任意端口(通常用于客户端)。 |
DatagramSocket(int port) | 创建UDP数据报Scoket套接字,绑定本机指定端口(通常用于服务器)。 |
DatagramSocket 常用方法 |
void receive(DatagramPacket p) | 接收数据报并写入参数p中,没有收到则会阻塞等待。 |
void send(DatagramPacket p) | 发送数据报。 |
void close() | 关闭socket套接字。 |
2)DatagramPacket
DatagramPacket?常用构造方法 |
DatagramPacket(byte[] buf, int length) | 构造用于存储数据报的容器,指定字节数组和数组长度。 |
DatagramPacket(byte[] buf,? int length, SocketAddress address) | 构造用于存储数据报的容器,指定字节数组、数组长度、目的地IP地址和端口号。 |
DatagramPacket 常用方法 |
InetAddress getAddress() | 从数据报中获取目的地的IP地址。 |
int getPort() | 从数据报中获取目的地的端口号。 |
byte[] getData() | 从数据报中获取字节数据。 |
3)InetSocketAddress
InetSocketAddress是SocketAddress的子类。 |
InetSocketAddress?常用构造方法 |
InetSocketAddress(String ip, int port) | 构造Socket地址,包含IP地址和端口号。 |
InetSocketAddress(InetAddress addr, int port) | 构造Socket地址,包含IP地址和端口号。 |
二、UDP数据报套接字通信模型概述
UDP协议具有无连接,面向数据报的特征。每次通信,双方都是没有建立连接的,并且一次性发送或接收全部通信内容。 |
UDP通信,使用DatagramSocket类构建套接字,使用DatagramPacket类构建数据报。 |
UDP通信流程:客户端构造请求->发出请求->服务器接收请求->解析请求->处理请求->构造响应->返回响应->客户端接收响应->解析响应->处理响应 |
三、回显客户端-服务器通信
1)服务器代码
public class UDP_Echo_Server {
private DatagramSocket socket = null;
public UDP_Echo_Server(int port) throws SocketException {
//作为服务器端,根据指定端口号创建一个数据报连接通道;
socket = new DatagramSocket(port);
}
//调用该方法启动服务器;
public void start() throws IOException {
System.out.println("服务器启动!");
while(true){
//新建一个数据报容器,用于存放请求;
DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
//接收数据报(请求),如果暂时没有请求,则在这里阻塞等待;
socket.receive(requestPacket);
//将获得的数据报(请求)转换为字符串;
String request = new String(requestPacket.getData(),0, requestPacket.getLength());
//通过process方法对请求报进行处理,并形成响应;
String response = process(request);
//将响应转换为数据报,数据包中已经指定了目的地IP;
DatagramPacket responsePacket = new DatagramPacket(
response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());
//将数据报(响应)发送;
socket.send(responsePacket);
//打印日志;
System.out.printf("[%s,%d] req=%s res=%s\n",
requestPacket.getAddress().toString(),requestPacket.getPort(),request,response);
}
}
private String process(String request) {
return request;
}
public static void main(String[] args) throws IOException {
UDP_Echo_Server server = new UDP_Echo_Server(端口号);
server.start();
}
}
2)客户端代码
public class UDP_Echo_client {
private DatagramSocket socket = null;
private String serverIP = "";
private int serverPort = 0;
public UDP_Echo_client(String IP,int Port) throws SocketException {
//作为客户端,需要显式知道服务器的IP和端口号;
this.serverIP = IP;
this.serverPort = Port;
//客户端自己的端口号,由系统自行分配即可,根据系统分配的端口号创建一个数据报连接通道;
socket = new DatagramSocket();
}
//调用该方法启动客户端;
public void start() throws IOException {
System.out.println("客户端启动!");
Scanner sc = new Scanner(System.in);
while (true){
System.out.print("->");
String request = sc.next();
//将字符串转换为数据报(请求),并在数据报中指定了目的地IP及端口;
DatagramPacket requestPacket = new DatagramPacket(
request.getBytes(),request.getBytes().length,
new InetSocketAddress(serverIP,serverPort));
//发送数据报(请求);
socket.send(requestPacket);
//新建一个数据报容器,用于存放响应;
DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
//接收数据报(响应),如果暂时没有响应,则在这里阻塞等待;
socket.receive(responsePacket);
//将获得的数据报(响应)转换为字符串;
String response = new String(responsePacket.getData(),0,responsePacket.getLength());
//打印响应;
System.out.println(response);
}
}
public static void main(String[] args) throws IOException {
UDP_Echo_client client = new UDP_Echo_client(IP地址,端口号);
client.start();
}
}
阅读指针 -> 《TCP回显服务器》
???????链接生成中........