udp 版本的 echo server 和 echo client

news2024/11/26 16:48:06

文章目录

  • 前言
  • UDP数据报套接字编程
    • 什么是套接字
    • 套接字的api
  • 示例:一发一收(无响应)
    • 客户端
    • 服务端


前言

基于udp socket写一个最简单的客户端服务器程序.

UDP数据报套接字编程

什么是套接字

我们先来解释一下什么是套接字吧!
套接字(socket)是一种网络通信的编程接口,是在应用层和传输层之间的一个抽象层,它提供了一组接口用于应用程序实现网络通信。

在网络通信中,套接字充当了一个通信链路的端点,通过套接字可以进行数据的读写和传输,套接字支持多种传输层协议,比如TCP和UDP等。通过套接字,我们可以创建一个服务器端应用程序,监听客户端的请求,也可以创建一个客户端应用程序,向服务器发送请求。

套接字的实现通常是由操作系统提供的,应用程序只需要调用相应的套接字接口即可进行网络通信。常见的套接字接口包括BSD socket、Winsock等。

系统给我提供的是俩种api,一种是基于TCP的,一种是基于UDP的,但是这俩者具体有什么区别呢?大家可以看看我的描述!
在这里插入图片描述
我们这里有一个专业名词,就是什么是全双工,什么是半双工,我这里画图解释一下.
在这里插入图片描述

套接字的api

我们首先来讲解一下什么是Datagram和socket
在这里插入图片描述

DatagramSocket API
DatagramSocket 是UDP Socket,用于发送和接收UDP数据报。
在这里插入图片描述

DatagramPacket API
DatagramPacket是UDP Socket发送和接收的数据报
在这里插入图片描述

示例:一发一收(无响应)

客户端发了个请求,服务器返回一个一模一样的响应.
—个服务器,主要要做三个核心工作:
1.读取请求并解析
2根据请求计算响应(省略了)3.把响应返回到客户端

客户端

import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class UdpEchoClient {
    private DatagramSocket socket = null;
    private String serverIP;
    private int serverPort;
    //客户端启动需要知道服务器在哪里!!!
    public UdpEchoClient(String serverIP, int serverPort) throws SocketException {
        //对于客户端来说,不需要显示关联端口
        //不代表没有端口,而是系统自动分配了个空闲端口
        socket = new DatagramSocket();
        this.serverIP = serverIP;
        this.serverPort = serverPort;
    }
    public void start() throws IOException {
        //通过这个客户端可以多次和服务器进行交互
        Scanner scanner=new Scanner(System.in);
        while(true){
            //1.先从控制台.读取一个字符串过来
            //    先打印一个提示符,提示用户输入内容
            System.out.println("-> ");
            String request=scanner.next();
            //2.把字符串构造程UDP packet,并进行发送
            DatagramPacket requestPacket =new DatagramPacket(request.getBytes(),request.getBytes().length,
                    InetAddress.getByName(serverIP),serverPort);
            socket.send(requestPacket);
            //3.客户端尝试读取服务器返回的响应
            DatagramPacket responsePacket =new DatagramPacket(new  byte[4096],4096);
            socket.receive(responsePacket);
            //4.将响应结果数据转换成String 显示出来
            String response = new String(responsePacket.getData(), 0, responsePacket.getLength());
            System.out.printf("req: %s, resp: %s\n", request, response);
        }

    }
    public static void main(String[] args) throws IOException {
        UdpEchoClient udpEchoClient = new UdpEchoClient("127.0.0.1", 9090);
        // UdpEchoClient udpEchoClient = new UdpEchoClient("42.192.83.143", 9090);
        udpEchoClient.start();
    }

}

服务端

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

public class UdpEchoServer {
    //需要预先定义一个socket对象
    //通过网络通信必须使用socket对象
    private DatagramSocket socket=null;
    //绑定一个端口
    //如果某个端口已经被别的进程占用了,此时这里的绑定操作就会出错
    //同一个主机上,一个端口,同一时刻,只能被一个进程绑定
    public UdpEchoServer(int port) throws SocketException {
        //构造socket的同时要指定关联/绑定的端口
        socket=new DatagramSocket(port);

    }
    //启动服务器主逻辑
    public void  start() throws IOException {
        System.out.println("服务器启动");
       /*
        //
            每次循环做三件事
            1.读取请求并且解析
            //2.根据请求计算响应
            //3.把响应写回客户端
        */
        while (true){
            //每次循环做三件事
            //1.读取请求并且解析
            //构造空饭盒
            DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);
            //饭堂大妈给饭盒里盛菜
            socket.receive(requestPacket);
            //为了方便处理这个请求,把数据包转成字符串
            String request=new String(requestPacket.getData(),0,requestPacket.getLength());
            //2.根据请求计算响应
            String response = process(request);
            //3.把响应写回客户端
            //根据response的字符串,构造一个DatagramPacket.
            //和请求的packet不同,此处构造响应的时候,需要指定这个包发给谁
            DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,
                    requestPacket.getSocketAddress());
            socket.send(requestPacket);
            System.out.printf("[%s:%d] req: %s, resp: %s\n", requestPacket.getAddress().toString(),
                    requestPacket.getPort(), request, response);

        }

    }
    // 这个方法希望是根据请求计算响应.
    // 由于咱们写的是个 回显 程序. 请求是啥, 响应就是啥!!
    // 如果后续写个别的服务器, 不再回显了, 而是有具体的业务了, 就可以修改 process 方法,
    // 根据需要来重新构造响应.
    // 之所以单独列成一个方法, 就是想让同学们知道, 这是一个服务器中的关键环节!!!
    public String process(String request) {
        return request;
    }

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

服务端和客户端的基本流程
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

流浪地球2:AI人工智能+数字生命+元宇宙

推荐:将 NSDT场景编辑器 加入你的3D开发工具链剧情介绍 太阳危机 太阳即将老化膨胀,吞没太阳系,地球上的人类构思了各种生存计划:其一是“数字生命计划”,该计划制造强大的量子计算机,希望让人类在数字世界…

D. Omkar and Circle(非常有意思的一道题)

Problem - D - Codeforces 丹尼是当地的数学狂人,他对圆形很着迷,这是奥姆卡最近的发明。帮他解决这个圆的问题!已知n个非负整数a1, a2,, an,它们排成一个圆,其中n必须是奇数。n -1能被2整除)。形式上&…

基于Tensorflow搭建卷积神经网络CNN(人脸识别)保姆及级教程

项目介绍 TensorFlow2.X 搭建卷积神经网络(CNN),实现人脸识别(可以识别自己的人脸哦!)。搭建的卷积神经网络是类似VGG的结构(卷积层与池化层反复堆叠,然后经过全连接层,最后用softm…

KD-2125地下电缆测试仪

一、产品概述 管线探测仪是一套高性能地下金属管线探测系统,由信号发射机和接收机组成,可用于金属管线、地下电缆的路径探测、管线普查和深度测量,配合多种选配附件,可以进行唯一性鉴别,以及管道绝缘破损和部分类型电缆…

HTML—javaEE

文章目录1.认识HTML2.HTML标签的使用2.1注释2.2标题2.3段落2.4换行2.5字体加粗、斜体字、删除线、下划线2.6图片2.7超链接2.8表格2.9列表2.10表单标签2.11div2.12span3.HTML特殊符号1.认识HTML (1)HTML是网页的编程语言,文件的内容主要由“标…

【从零开始学Skynet】实战篇《球球大作战》(十一):战斗场景设计

现在的服务端框架有支撑数万玩家的能力,且支持横向拓展(即 增加物理机数量),理论上具有无上限的负载能力。下面以《球球大 作战》为例,说明怎样使用这套框架。1、战斗流程 玩家登录后,玩家可以做些非战斗操…

形式语言和自动机总结DFA、NFA

第一章DFA 形式定义和状态转移函数: DFA是一种特殊的NFA, A{Q,,,,F} Q:输入状态集,∑:字母表,δ:状态转移函数Q∑→Q q0∈Q初始状态 F终结集 设计举例 1.设计接受偶数个0和偶数个1串的DFA 2.设计 DFA 接受 {0,1} 上的字符串 w, 且 w 是 …

C++之模拟实现map和set

文章目录前言一、迭代器1.begin()和end()2.operator()二、改造红黑树三、map的模拟实现四、set的模拟实现总结前言 基于之前的红黑树和map、set的相关知识,本节我们使用红黑树来模拟实现STL中的map和set。 一、迭代器 使用迭代器可以方便我们对数据结构进行遍历&a…

windows安装wsl2

总的来说是按照这三个链接来的,也写了一个大体流程。 wsl对win版本有要求,可以 winr winver查看 原始参考链接: 1)https://zhuanlan.zhihu.com/p/466001838 2)https://cloud.tencent.com/developer/article/1986728 3&…

SpringCloud之Eureka、Ribbon及Nacos

SpringCloud之Eureka、Ribbon及Nacos 文章目录SpringCloud之Eureka、Ribbon及Nacos1. 单体架构和微服务架构2. SpringBoot、SpringCloud及SpringCloud Alibaba之间的版本对应关系2022.x 分支2021.x 分支2.2.x 分支组件版本关系3. Eureka3.1 Eureka-server注册中心3.2 Eureka-cl…

Elasticsearch:使用 ingest pipeline 来管理索引名称

在我之前的文章 “Elasticsearch:使用 pipelines 路由文档到想要的 Elasticsearch 索引中去” 我详述了如何使用已有的 date_index_name 处理器来把文档归类到所需要的和文档日期相关的的索引中去。比如,我们想把 2023 年 4 月的所有文档写入到 my-index…

【QT】MainWindow中如何为菜单栏或工具栏中的Menu或Action设置快捷键

目录1. 设置快捷键的两种方法1.1 在控件title属性的某个字母前加上&,(Alt该字母)作为快捷键1.2 使用 setShortcuts,(Ctrl字母)作为快捷键2. 为菜单栏中的 menu 设置快捷键2.1 测试2.2 代码3. 为菜单栏或工具栏中的…

百兆以太网使用的电信号编码分析

以太网是一种计算机局域网的组网技术。在IEEE制定的IEEE 802.3标准给出了以太网的技术标准。它规定了包括物理层的连线、电信号和介质访问层协议的内容。以太网是当前应用普遍的局域网技术。它很大程度上取代了其他局域网标准,如令牌环、FDDI和ARCNET。 我们常见的网…

Netty通信技术进阶一

Netty通信技术进阶1. 概念2. 线程同步、异步3. 其他通信技术对比4. Netty中的Reactor实现5. Pipeline 和 Handler5.1 ChannelHandler 分类6. 入站事件传播7.inbound/outbound 加载顺序和执行顺序8. 出站事件传播9. Code example9.1 编写服务端9.2 编写客户端10. 核心组件10.1 B…

虚拟直播需要哪些设备?如何搭建虚拟直播团队?

虚拟直播不止是新兴的娱乐途径 ,还是新的商业模式 。虚拟直播的出现,是互联网娱乐趋势的变化,带来了更加丰富多彩的娱乐形式,同时也优化了传统直播模式下的人力物力成本,使直播行业更加效率及智能。 科技不断发展&…

JDBC(数据库连接)

MYSQL 数据库总结: http://t.csdn.cn/Ka9Vm JDBC是使用Java语言操作关系型数据库的一套API。 将mysql-connector-j-8.0.32jar复制粘贴到一个新建的目录里,然后右键mysql-connector-j-8.0.32jar,添加为库。 DriverManager 一个工厂类&…

2023易派客工业品展览会在苏州开幕

展厅面积达5.3万平方米,500多家重要工业领军企业参展,20组企业签署购销意向协议,签约金额超82亿元 ​ 4月13日,“2023易派客工业品展览会”在苏州国际博览中心开幕。展会以“绿色智造融通赋能”为主题,500多家重要工业…

CART分类树算法

1. CART分类树算法的最优特征选择方法 我们知道,在ID3算法中我们使用了信息增益来选择特征,信息增益大的优先选择。在C4.5算法中,采用了信息增益比来选择特征,以减少信息增益容易选择特征值多的特征的问题。但是无论是ID3还是C4.…

FreeRTOS中临界段的保护(笔记)

目录临界段的定义Cortex-M内核快速关开关中断的指令关中断开中断进入临界段的宏退出临界段的宏进入临界段,不带中断保护, 不能嵌套进入临界段,带中断保护版本,可以嵌套退出临界段,不带中断保护版本,不能嵌套…

【数据结构与算法】堆的实现(附源码)

目录 一.堆的概念及结构 二.接口实现 A.初始化 Heapinit 销毁 Heapdestroy B.插入 Heappush 向上调整 AdjustUp 1.Heappush 2.AdjustUp C.删除 Heappop 向下调整 AdjustDown D.堆的判空 Heapempty 堆顶数据 Heaptop 堆的大小 Heapsize 三.源码 Heap.h He…