【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器

前言

🌟🌟本期讲解关于TCP/UDP协议的原理理解~~~

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

🔥 你的点赞就是小编不断更新的最大动力

🎆那么废话不多说直接开整吧~~~

目录

1.UDP的API使用

1.1DatagramSocket

1.2DatagramPacket

2.实现回显服务器

2.1概念

2.2服务器的操作过程

1.初始化服务器

2.读取请求并解析

3.根据请求实现响应

4.把响应返回给客户端

5.客户端的IP和端口号打印

6.主函数的实现

2.3客户端的操作过程

1.初始化客户端

2.控制台输入请求

3.构造请求并且发送

4.读取服务器的响应

5.主函数的实现

2.4回显服务器基本流程

2.5打印日志分析

3.总结

1.UDP的API使用

1.1DatagramSocket

这里负责对Socket进行读写,借助网卡进行数据的读写操作;

这里的初始化方法有以下几种:

|------------------------------|----------------------------------------|
| DatagramSocket() | 创建一个UDP数据报套接字Socket,绑定到本机的随意的一个端口(客户端) |
| DatagramSocket(int port) | 创建一个UDP数据报套接字Socket,绑定到本机的指定的一个端口(服务器) |

还包括实现那套接字的方法:

|-------------------------------|--------------|
| receive(DatagramPacket p) | 使用套接字实现数据的读取 |
| send(DatagramPacket p) | 使用套接字实现数据的写入 |

注意:这里的DatagramPacket就是一个输出型参数

1.2DatagramPacket

接着上面,小编提到这里的DatagramPacket是一个输出型参数,和前面实现文件IO的操作类似的,这里的就是一个UDP数据报,是接收和发送数据的基本单位;

2.实现回显服务器

2.1概念

回显服务器:相当于我们之前学习的输出hello world,这里的回显服务器代表的是没有任何逻辑过程,即客户端请求啥就直接响应啥;

2.2服务器的操作过程

1.初始化服务器

代码如下:

java 复制代码
public class UDPServer {
    //构造方法
     private DatagramSocket socket=null;
     public UDPServer(int port) throws SocketException {
        //通过socket对网卡进行数据的操作
        socket=new DatagramSocket(port);
    }

注意:

1.我们所有的对于网卡的操作就是借用这里的socket实现,这里的port是一个端口号,服务器是可控的所以这里就要指定一个端口号;

2.抛出异常,当端口号被一个进程占用了,那么端口号就创建失败了,一个端口号只能被一个进程占用,但是一个进程可以占用多个端口号;

2.读取请求并解析

代码如下:

java 复制代码
public void start() throws IOException {
        System.out.println("服务器启动!");
        while (true) {
            // 每次循环, 就是处理一个请求-响应过程.
            // 1. 读取请求并解析
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096], 4096);
            socket.receive(requestPacket);
            // 读到的字节数组, 转成 String 方便后续的逻辑处理.
            String request = new String(requestPacket.getData(), 0, requestPacket.getLength());

注意:

1.这里的死循环是为了表示,服务器是24小时不间断的,所以没有必要进行退出的操作;

2.通过DatagramPacket设置保存这里的读取到的字节信息,这是一个输出型参数;

3.此时的receive就能读取到UDP数据报的的内容,存放到requestPacket字节数组中;并且这里还知道原IP端口是啥(即数据从哪里来的)

4.最后将这里的字节类型的数据转化为字符串类型的数据,字节数组里不一定就是二进制的数据,还可能是文本类型的数据,使用string保存恰到好处;

3.根据请求实现响应

代码如下:

java 复制代码
 String response = process(request);


 public String process(String request) {
        return request;
    }

注意:

由于回显服务器是没有业务逻辑的,所以在实现对应的响应的时候,直接放回输出的请求即可

4.把响应返回给客户端

代码如下:

java 复制代码
 // 3. 把响应返回到客户端.
 //    构造一个 DatagramPacket 作为响应对象
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(), response.getBytes().length,
            requestPacket.getSocketAddress());
            socket.send(responsePacket);

注意

1.这里的实现对于字符串的操作,把string的字节数组给提取出来;

2.这里还使用了socketAddress实现,得到INetAddress对象,包含了客户端的的IP和端口号,即客户端的数据报;

5.客户端的IP和端口号打印

代码如下:

java 复制代码
  System.out.printf("[%s:%d] req: %s, resp: %s\n", requestPacket.getAddress().toString(),
                    requestPacket.getPort(), request, respond);

注意:

这里代表的就是客户端的IP,端口号,以及请求和响应;

6.主函数的实现

代码如下:

java 复制代码
public static void main(String[] args) throws IOException {
        UDPServer udpServer=new UDPServer(9090);
        udpServer.start();
    }

注意:

这里的9090是我们程序员规定的服务器的端口号;

2.3客户端的操作过程

1.初始化客户端

代码如下:

java 复制代码
public class UDPClient {
    private DatagramSocket socket=null;
    private String ServerIP;
    private int ServerPort;
    public UDPClient(String serverIP,int serverPort) throws SocketException {
        this.ServerIP= serverIP;
        this.ServerPort=serverPort;
        socket=new DatagramSocket();
    }

注意:

这里要设置要请求的服务器的IP和端口号,因为发起请求就是要知道服务器在哪里;这里和上面日志的打印是一致的,请求的IP是客户端的本机IP,客户端是系统随机分配的;

2.控制台输入请求

代码如下:

java 复制代码
 public void start() throws IOException {
        System.out.println("客户端启动");
        Scanner sc=new Scanner(System.in);
        while (true){
            System.out.println("->");
            if (!sc.hasNext()){
                break;
            }

注意:

这里和服务器是一致的,都是24小时不间断的,这里的sc.hashnext是为了表示没有更多的的输入了,那么就返回false去反后就跳出循环;

3.构造请求并且发送

代码如下:

java 复制代码
String request=sc.next();
            DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length,
            InetAddress.getByName(ServerIP),ServerPort);
            //来自哪里的信息
            socket.send(requestPacket);

注意:

这里就是通过字符串转为字节数据,并且指定发送的端口号和IP地址,最后通过send进行发送数据,请求服务器;

4.读取服务器的响应

代码如下:

java 复制代码
// 4. 读取服务器的响应.
            DatagramPacket respondPacket=new DatagramPacket(new byte[1024],1024);
            socket.receive(respondPacket);

            String respond=new String(respondPacket.getData(),0,respondPacket.getLength());

            System.out.println(respond);

注意:

这里就规定传输的数据单位,通过接收服务器传来的响应,保存到字节数组里面,最后转为string字符串类型的数据,在实现打印

5.主函数的实现
java 复制代码
public static void main(String[] args) throws IOException {
        UDPClient udpClient=new UDPClient("127.0.0.1", 9090);
        udpClient.start();
    }

注意:

这里的"127.0.0.1"是本机的IP地址,9090是我们输入的服务器端口号;

2.4回显服务器基本流程

如下图片的实现过程:

小编这里由于宽度不够就无法完全分开,请见谅~~~以上就是具体的实现过程

第一步:服务器启动进入receive,发现没有请求,那么就直接进入阻塞;

具体代码:

java 复制代码
 DatagramPacket requestPacket=new DatagramPacket(new byte[1024],1024);
            //通过接收的方法进行数据的传入
            socket.receive(requestPacket);

第二步:客户端进入循环,执行到sc.hashnext进入阻塞,知道用户输入内容;

具体代码:

java 复制代码
 System.out.println("->");
            if (!sc.hasNext()){
                break;
            }

第三步:输入请求的内容,转化为字节类型数据,指定服务器IP和端口号,发送请求

具体代码:

java 复制代码
 String request=sc.next();
            DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length,
                    InetAddress.getByName(ServerIP),ServerPort);
            //来自哪里的信息
            socket.send(requestPacket);

第四步:服务器解除阻塞,读取DatagramRocket对象,构造string需求,根据需求执行响应操作,最后返回构造响应对象,并进行send发送的操作;这个过程客户端阻塞

具体代码:

java 复制代码
 String request=new String(requestPacket.getData(),0,requestPacket.getLength());
            //注意这里的长度是字节的长度,不是字符串的长度
            //进行响应的操作
            String respond=process(request);
            //发送响应,转化为面向数据包的类型
            DatagramPacket respondPacket=new DatagramPacket(respond.getBytes(),respond.getBytes().length,
                    requestPacket.getSocketAddress());
            //最后发送这个数据
            socket.send(respondPacket);

第五步:客户端接收服务器传来的数据,存储在字节数组中,然后转化为字符串数据类型,实现打印在控制台上;

具体代码:

java 复制代码
 DatagramPacket respondPacket=new DatagramPacket(new byte[1024],1024);
            socket.receive(respondPacket);

            String respond=new String(respondPacket.getData(),0,respondPacket.getLength());

            System.out.println(respond);

2.5打印日志分析

这里我们启动服务器和客户端后,进行输入:

这里我们就可以看到输出一个nihao那么就返回一个nihao,那么我们可以看看服务器的打印日志

如下图:

此时注意前面两个第一个是"127.0.0.1"是我们自己的本机IP地址,并且后面这个就是请求的端口;

3.总结

💬💬本期小编主要讲解了UDP的API的使用,并且通过UDP提供的API实现回显服务器的实现,当然这里设计到服务器和客户端两边的实现过程~~~

具体代码已上传gitee,代码在这里:network: 网络编程

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

😊😊 期待你的关注~~~

相关推荐
00后程序员张20 分钟前
Charles抓包-安装和IOS抓包指导
websocket·网络协议·tcp/ip·http·网络安全·https·udp
落——枫24 分钟前
无线通信网
网络
Exquisite.1 小时前
OSPF的拓展配置
网络
阿里云云原生1 小时前
阿里云 MSE Nacos 发布全新“安全防护”模块,简化安全配置,提升数据保护
网络·安全·阿里云
WSSWWWSSW1 小时前
分布式热点网络
网络·分布式
庸子3 小时前
Active Directory域服务管理与高级应用技术白皮书
运维·服务器·网络·windows·ad
开发者工具分享3 小时前
项目后期发现重大漏洞,如何紧急修复
网络·安全·web安全
搬码临时工4 小时前
路由器端口映射的意思、使用场景、及内网ip让公网访问常见问题和解决方法
运维·服务器·网络·物联网·tcp/ip·计算机网络·智能路由器
、我是男生。4 小时前
MQTT、HTTP短轮询、HTTP长轮询、WebSocket
websocket·网络协议·http
小徐Chao努力4 小时前
【计网】SSL/TLS核心原理
网络·网络协议·ssl