<JavaEE> 基于 UDP 的 Socket 通信模型

发布时间:2023年12月22日

目录

一、认识相关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回显服务器》

???????链接生成中........

文章来源:https://blog.csdn.net/zzy734437202/article/details/135144212
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。