首页 > 其他分享 >初识UDP(编写一个回显服务器)

初识UDP(编写一个回显服务器)

时间:2024-12-04 20:32:18浏览次数:9  
标签:UDP DatagramPacket socket 回显 初识 new 服务器 String

目录

初识UDP(编写一个回显服务器)

UDP 是传输层的协议

操作系统提供了UDP API(操作系统提供给我们进行网络编程的API叫做“socket API”---->“网络编程套接字”

想必大家应该听说过 UDP的特点:无连接,不可靠传输,面向数据报,全双工

UDP socket API的使用

核心的类有两个:

1.DatagramSocket

(操作系统中有一类文件,就叫做socket文件。通过网卡发送数据,就是写socket文件,通过网卡接收数据,就是读socket文件)、

负责对socket文件读写,也就是借助网卡发送接收数据

在这里插入图片描述

在这里插入图片描述

2.DatagramPacket

UDP面向数据报,每次发送接收数据的基本单位,就是UDP数据包

DatagramPacket表示了一个UDP数据报

实现一个回显服务器

回显服务器是网络编程中最简单的程序了,属于网络编程的hello world

回显服务器:客户端发啥请求就返回啥响应,没有啥业务逻辑

通过实现这个回显服务器,我们就能知道socket API 的使用,还有典型的客户端服务器基本工作流程

服务器代码

服务器来说:

第一步,需要创建DatagramSocket对象

接下来要操作网卡,操作网卡都是通过socket对象来完成的(socket对象是在内存中,针对这个内存进行操作就能影响到网卡)

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpEchoServer {
    private DatagramSocket socket=null;
    public UdpEchoServer(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());
            String response=process(request);
            DatagramPacket responsePacket =new DatagramPacket(response.getBytes(),response.getBytes().length
                    ,requestPacket.getSocketAddress());
            socket.send(responsePacket);
            System.out.printf("[%s:%d] req: %s, resp: %s\n", requestPacket.getAddress().toString(),
                    requestPacket.getPort(), request, response);

        }
    }
    public String process(String request){
        return request;
    }
    public static void main(String[] args) throws IOException {
        UdpEchoServer service=new UdpEchoServer(9090);
        service.start();


    }
}



客户端代码

编写客户端的代码

首先也是要创建socket对象。但是此处不需要手动指定端口号。

服务器这边,要手动指定端口。
客户端这边,一般不要手动指定。不手动指定,也有端口,系统自动分配一个空闲的端口号

import java.io.IOException;
import java.net.*;
import java.util.Scanner;


public class UdpEchoClient {
    private DatagramSocket socket=null;
    private String serverIp;
    private int serverPort;
    // 此处 ip 使用的字符串, 点分十进制风格. "192.168.2.100"
    public UdpEchoClient(String serverIp,int serverPort) throws SocketException {
        this.serverIp=serverIp;
        this.serverPort=serverPort;
        socket=new DatagramSocket();

    }
    public void  start() throws IOException {

        System.out.println("客户端启动!");
        Scanner scanner=new Scanner(System.in);
        while (true){
            //要做四个事情
            //1.提示用户接下来要输入内容
            System.out.println("->");
            //2.从控制台读取要发送的请求数据
            if(!scanner.hasNext()){
                break;
            }
            String request=scanner.next();
            //3.构造请求并发送
            DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length
            , InetAddress.getByName(serverIp),serverPort);
            socket.send(requestPacket);
            //4.读取服务器的响应
            DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);
            //5.把响应显示到控制台上
            String response=new String(responsePacket.getData(),0,responsePacket.getLength());
            System.out.println(response);
        }
    }
    public static void main(String[] args) throws IOException {
        UdpEchoClient client=new UdpEchoClient("127.0.0.1",9090);
        client.start();

    }
}

实现效果

在这里插入图片描述

代码解释

在这里插入图片描述

服务器程序一启动就需要关联上/绑定一个操作系统中的端口号(手动指定一个端口号)

在这里插入图片描述

对于服务器来说,需要不停的收到请求,返回响应,收到请求,返回响应

服务器往往是7*24小时运行的,要持续不断地运行下去,这里的while(true)也没有退出的必要,如果你确实想重启服务器咋办,可以直接杀进程即可。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

流程解释

整个过程中,首先一定是服务器先启动

  1. 服务器启动。启动之后,立即进入while循环,执行到receive,进入阻塞。此时没有任何客户端发来请求呢
  2. 客户端启动。启动之后,立即进入while循环,执行到hasNext这里进入阻塞。此时用户没有在控制台输入任何内容
  3. 用户在客户端的控制台中输入字符串,按下回车。此时hasNext阻塞解除,next会返回刚才输入的内容。
    基于用户输入的内容,构造出一个DatagramPacket对象,并进行send
    send执行完毕之后,继续执行到receive操作,等待服务器返回的响应数据(此时服务器还没返回响应呢,这里也会阻塞)
  4. 服务器收到请求之后,就会从receive的阻塞中返回。
    返回之后,就会根据读到的DatagramPacket对象,构造String request,通过process方法构造一个String response
    再根据response构造一个DatagramPacket表示响应对象,再通过send来进行发送给客户端
    执行这个过程中,客户端也始终在阻塞等待
  5. 客户端从receive中返回执行,就能够得到服务器返回的响应。并且打印倒控制台上。
    与此同时,服务器进入下一次循环,也要进入到第二次的receive阻塞,等待下个请求了。

上述代码中,可以看到,UDP是无连接的通信,UDP socket自身不保存对端的IP和端口,而是在每个数据报中有一个
另外代码中也没有"建立连接""接受连接"操作 不可靠传输,代码中体现不到的。
面向数据报,send和receive都是以DatagramPacket为单位。

标签:UDP,DatagramPacket,socket,回显,初识,new,服务器,String
From: https://blog.csdn.net/t1750982356/article/details/144223670

相关文章

  • 初识TCP(编写回显服务器)
    目录初识TCP(编写回显服务器)TCP相关的API服务器代码实现客户端代码实现部分代码解释注意事项效果展示初识TCP(编写回显服务器)TCP相关的APIServerSocket:这是socket类,对应到网卡,但是这个类只能给服务器进行使用socket:对应到网卡,既可以给服务器使用,又可以给客户端......
  • 【攻防技术系列】Rce漏洞数据不回显解决策略
    一、数据带外1.1DNSlog1.2TCP-Portlog1.3ICMP-Sizelog二、延迟判断三、写文件四、反弹权限4.1反向连接4.2正向连接免责声明请勿使用本文中提到的技术进行非法测试或行为。使用本文中提供的信息或工具所造成的任何后果和损失由使用者自......
  • [Linux网络]TCP和UDP协议的底层理论
    目录一、TCP和UDP协议的简单认识1.传输层协议2.五元组二、UDP协议1.UDP协议格式2.UDP协议的特点3.面向数据报4.UDP传输报文在内核中的管理5.基于UDP协议的应用层协议(部分)三、TCP协议1.发送和接收数据示意图2.TCP协议格式3.确认应答机制和超时重传机制4.发......
  • 初识C语言|笑谈函数指针与数组
    C语言函数指针和函数指针数组:代码世界的“神秘宝藏” 家人们,今天咱来唠唠C语言里超“哇塞”的函数指针和函数指针数组,这俩可堪称代码宇宙中的“神秘宝藏”,一旦掌握,那编程水平直接“起飞”,在代码江湖中“大杀四方”都不是事儿。 先说说函数指针,这玩意儿就像是给函数定......
  • TCP/IP 和 UDP
    一、TCP/IP(传输控制协议)TCP/IP是一个协议族,它是互联网的基础协议,为网络通信提供了标准化的方法。TCP/IP分为四个层次,每一层都有特定的功能:应用层:这是最接近用户的层,包含了所有高级协议,如HTTP(网页浏览)、FTP(文件传输)、SMTP(邮件传输)等。应用层负责应用程序之间的交互,确保数......
  • 初识微信小程序
    微信小程序入门什么是微信小程序小程序是⼀种新的开放能⼒,在微信内被便捷地获取和传播。⼩程序的优势和劣势优势成本更低使⽤便捷容易推⼴体验良好劣势受微信的限制,不能涉及积分和虚拟交易单包⼤⼩限制2M发布麻烦小程序的模版语法wxml逻辑渲染<viewwx:if="{......
  • 初识C语言学习笔记
    ......
  • 初识Linux---Linux中的常用基本指令(上)
    Linux中的基本指令一.Linux操作系统的背景二.Linux下的基本指令01.ls指令02.pwd命令03.cd指令04.touch指令和nano05.mkdir指令(重要):06.rmdir指令&&rm指令(重要)07.man指令(重要):07.cp指令(重要)08mv指令(重要)09cat指令10.more指令11.less指令(重要)一.Linux操作系统的......
  • Linux -初识 与基础指令1
    博客主页:【夜泉_ly】本文专栏:【Linux】欢迎点赞......
  • 【初阶数据结构和算法】初识树与二叉树的概念以及堆和完全二叉树之间的关系
    文章目录一、树的概念与结构1.树的概念2.树的相关术语3.树的表示4.树形结构实际运用举例二、二叉树的概念及特殊二叉树1.二叉树的概念2.特殊的二叉树满二叉树完全二叉树二叉树的性质(由满二叉树特点推导)三、二叉树的存储结构1.二叉树的顺序结构2.二叉树的链式结构......