当前位置: 首页 > news >正文

【JavaEE】网络编程——UDP

在这里插入图片描述
🤡🤡🤡个人主页🤡🤡🤡
🤡🤡🤡JavaEE专栏🤡🤡🤡

文章目录

  • 1.数据报套接字(UDP)
    • 1.1特点
    • 1.2编码
      • 1.2.1DatagramSocket
      • 1.2.2DatagramPacket
      • 1.2.3实现一个UDP(24*7)回显服务器
      • 1.2.4实现一个UDP客户端
      • 1.2.5实现一个UDP字典翻译服务器
  • 2.客户端与服务器的流程

1.数据报套接字(UDP)

1.1特点

  1. 无连接:数据在传输前无需建立专用通道,每一个数据包独立发送,并自行选择路径到达目的地,好比发送信息,你只要发送了信息就行,不需要对方接收。
  2. 不可靠传输:在传输数据的时候,不需要关注对方是否收到了,发送了就可以。
  3. 面向数据流:传输数据的基本单位是一个个的UDP数据报,一次读写,只能读写一个完整的UDP数据报
  4. 全双工:一条链路中,能够进行双向通信。

1.2编码

Socket api都是系统提供的,不同的系统提供的api是不一样的,但是java中对于系统的这些api进一步封装了。
UDP中的socket api 重点是两个类:DatagramSocket 和DatagramPacket

1.2.1DatagramSocket

这个类的作用可以看作"操作网卡"的遥控器,也就是对网卡进行读写操作,可以理解成像文件那样读写的形式。
提供了几个方法:
在这里插入图片描述

1.2.2DatagramPacket

这个类是描述UDP数据报,一个DatagramPacket对象相当于一个UDP数据报,一次发送一次接收就是传输了一个DatagramPacket对象。

1.2.3实现一个UDP(24*7)回显服务器

回显(Echo):客户端给服务器发送不同的请求,服务器就会返回不同的响应。但在此处回显就是客户端给服务器请求啥,服务器就响应啥,不做任何计算和业务逻辑。

public class udpEchoServer {public 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 = this.process(request);//将处理完的请求返还给客户端DatagramPacket resposePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,requestPacket.getSocketAddress());socket.send(resposePacket);//打印客户端的ip地址端口号和接收客户端的数据以及处理完客户端后的数据System.out.printf("[%s:%d] req = %s,resp = %s\n",requestPacket.getAddress(),requestPacket.getPort(),request,response);}}public String process(String request) {return request;}public static void main(String[] args) throws IOException {udpEchoServer udpEchoServer = new udpEchoServer(9999);udpEchoServer.start();}
}

在这里插入图片描述
DatagramPacket对象表示的就是一个数据报,UDP数据报是由报头和载荷组成的,报头中的有IP地址和端口号这些都是DatagramPacket类的属性,而载荷这个类没有提供,所以需要程序猿自己去提供,所以就像和尚化缘一样,你需要自己提供一个化缘的碗,然后各家将食物放到碗中,由于数据报的本质就是一个二进制数据,所以我提供了一个字节数组来作为这个载荷存储数据。
在这里插入图片描述
从客户端接收过来的数据,经过服务器处理完之后要返还给客户端,所以需要在创建一个DatagramPacket对象来存储由服务器处理完之后的数据,再服务器发送给客户端。此时的DatagramPacket对象就不需要提供一个空白的空间,将处理完的数据放入这个对象就行,由于在接收数据的时候就记录了客户端的ip地址和端口号,所以在发送给客户端的时候只需要通过requestPacket.getSocketAddress()来获取客户端的IP地址和端口号。
在这里插入图片描述
由于服务器是固定的,所以可以直接自己去设置端口号,当服务器启动的时候端口号就被创建了。
为什么需要端口号IP地址?
要实现双方通信成功,必须要有这个四个核心指标:
源端口,源IP,目的端口,目的IP
通过这四个核心指标就可以实现双方网络通信,此处没有服务器的IP地址,是因为客户端和服务器在同一个主机上。我们可以用一个IP来表示172.0.0.1也称环回IP。

1.2.4实现一个UDP客户端

public class udpEchoClient {private DatagramSocket socket = null;private String serverIp;private int serverProt;public  udpEchoClient(String serverIp, int serverProt) throws SocketException {socket = new DatagramSocket();this.serverIp = serverIp;this.serverProt = serverProt;}public void start() throws IOException {System.out.println("客户端启动!");//1.从控制台获取字符串Scanner scanner = new Scanner(System.in);while(true) {System.out.println("请输入要发送的请求: ");String request = scanner.nextLine();//2.将输入的字符串发送给服务器,还要将发送的目标确定,IP和端口号DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), 0, request.getBytes().length,InetAddress.getByName(serverIp), serverProt);socket.send(requestPacket);//3.从服务器读取到经过处理的响应DatagramPacket responsePackt = new DatagramPacket(new byte[4096], 4096);socket.receive(responsePackt);//将响应打印在控制台String response = new String(responsePackt.getData(), 0, responsePackt.getLength());System.out.println(response);}}public static void main(String[] args) throws IOException {udpEchoClient udpEchoClient = new udpEchoClient("127.0.0.1",9999);udpEchoClient.start();}
}

在这里插入图片描述
从控制台接收到的字符串,requestPacket对象获取到字符串对象的引用以及长度,还有自己的IP和Prot,然后通过socket的send方法发送到服务器上。
在这里插入图片描述
从服务器接收的响应,需要创建一个responsePackt对象,并且提前创建好一个空白的字节数组来接收从服务器接收的响应。
对一些方法区分一下:
在对方法区分前,我们需要理解字节,字符,编码形式的概念
字节与字符本质上都是二进制,就是0101这种数据,因为计算机只认识0101。
字节:字节是计算机存储数据的基本单位,1个字节就是8个bit,每个位可以是0或1,表示一个字节可以表示256个不同的值.
字符:字符是表示文本信息的基本单位,根据不同的编码形式,就会有一个字符对应多少个字节就有所不同,通过编码形式可以将字符转化为字节再通过字节来表示数据,传输数据和存储数据。
编码形式:

  1. ASCII码:用于表示英文字符。它使用7位来表示128个字符(包括大小写字母、数字、标点符号和一些控制字符),就是不支持中文字符,这里就是一个字符对应一个字节
  2. Unicode(UTF8):UTF-8是一种变长的编码形式,包括全球所有书写系统的字符,兼容ASCII字符集,并且支持中文字符,包括全球所有书写系统的字符,一个字符对应1-4字节。
  3. GBK:采用变长编码,主要用于中文字符编码,一个字符对应1-2字节

方法区别一下:

  1. getBytes():得到字节数组的引用,对象是字符,这里就是将字符转化为字节来存储数据
  2. getBytes().length:得到字节数组的长度,对象是字符
  3. getData():得到的是由字符组成的字符串的引用,对象是字节,这里就是将字节转化为字符来使用数据
  4. getLength():得到的字符串的长度,对象是字节
  5. getAddress():获取IP地址,对象是DatagramPacket
  6. getPort():获取Prot端口号,对象是DatagramPacket
  7. getSocketAddress():获取到IP地址和Prot端口号,对象是DatagramPacket
  8. InetAddress.getByName():这个方法可以解析主机名并返回该主机名的 IP 地址,或者直接返回给定 IP 地址的 InetAddress 对象,得到的InetAddress 对象传给服务器,服务器通过得到这个对象就可以解析出IP地址。

1.2.5实现一个UDP字典翻译服务器

这里我们可以应用继承与多态的思想来实现这个服务器,因为这个字典翻译服务器与回显服务器本质的区别就是对响应的处理,所以我们对重复的代码继承复用,扩展需要的代码即可。

public class udpDictServer extends udpEchoServer{HashMap<String,String> map = null;public udpDictServer(int port) throws SocketException {super(port);map = new HashMap<>();map.put("server","服务");map.put("client","客户端");map.put("cat","🐱");map.put("dog","🐕");map.put("pig","🐖");}@Overridepublic String process(String request) {return map.getOrDefault(request, "该词汇没有查询到");}public static void main(String[] args) throws IOException {udpDictServer udpDictServer = new udpDictServer(9999);udpDictServer.start();}
}

实现这个字典翻译,还需要数据结构中的map,利用map中的键值对来存储数据。
在这里插入图片描述
然后具体的业务操作就只需要重写process方法即可。
在这里插入图片描述
在执行到这里的时候虽然这个this指的是父类的udpEchoServer对象,但是由于udpDictServer子类继承了udpEchoServer父类有重写了process方法,由于多态的特性执行的process方法其实是子类的process方法。

2.客户端与服务器的流程

  1. 从控制台获取数据
  2. 客户端将数据发送到服务器
  3. 服务器接收客户端发送过来的数据
  4. 计算响应
  5. 服务器将计算好的响应发送给客户端
  6. 客户端接收服务器发送的响应
  7. 将从客户端接收服务器发送的响应打印在控制台

相关文章:

【JavaEE】网络编程——UDP

&#x1f921;&#x1f921;&#x1f921;个人主页&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;JavaEE专栏&#x1f921;&#x1f921;&#x1f921; 文章目录 1.数据报套接字(UDP)1.1特点1.2编码1.2.1DatagramSocket1.2.2DatagramPacket…...

JAVA毕业设计147—基于Java+Springboot的手机维修管理系统(源代码+数据库)

基于JavaSpringboot的手机维修管理系统(源代码数据库)147 一、系统介绍 本项目分为用户、管理员、维修员三种角色 1、用户&#xff1a; 注册、登录、新闻公告、售后申请、申请列表、意见反馈、个人信息、密码修改 2、管理员&#xff1a; 用户管理、用户管理、栏目管理、网…...

力扣第228题“汇总区间”

在本篇文章中&#xff0c;我们将详细解读力扣第228题“汇总区间”。通过学习本篇文章&#xff0c;读者将掌握如何遍历和汇总区间&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释&#xff0c;以便于理解。 问题描述 力扣第228题“汇总区间”描…...

部署大语言模型并对话

在阿里云的https://developer.aliyun.com/adc/scenario/b105013328814fe995c0f091d708d67d 选择函数计算 设置服务器配置 复制公网地址 这个地址不能直接 在返回应用&#xff0c;创建应用LLM 对话页面 Open WebUI 点击下面的创建应用 部署完成后访问域名 打开访问地址...

WebSocket、socket.io-client

WebSocket WebSocket 是一种网络通信协议&#xff0c;它提供了一个在单个长期持久的 TCP 连接上进行全双工&#xff08;full-duplex&#xff09;通信的通道。 WebSocket 允许客户端和服务器之间进行双向的数据交换&#xff0c;这意味着服务器可以主动向客户端推送数据&#x…...

Maven 仓库

在 Maven 世界中&#xff0c;任何一个依赖、插件或者项目构建的输出&#xff0c;都可以称为 构件 。 坐标和依赖是构件在 Maven 世界中的逻辑表示方式&#xff0c;构件的物理表示方式是文件&#xff0c;Maven 通过仓库来统一管理这些文件。 任何一个构件都有一组坐标唯一标识。…...

给后台写了一个优雅的自定义风格的数据日志上报页面

highlight: atelier-cave-dark 查看后台数据日志是非常常见的场景,经常看到后台的小伙伴从服务器日志复制一段json数据字符串,然后找一个JSON工具网页打开,在线JSON格式化校验。有的时候,一些业务需要展示mqtt或者socket的实时信息展示,如果不做任何修改直接展示一串字符…...

【React Native优质开源项目】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

Android 自动更新时间的数字时钟 TextClock

TextClock 继承 TextView &#xff0c;使用方法和 TextView 一样。 它专门用于显示数字时钟&#xff0c;可以自定义显示格式。 只要在布局文件里添加&#xff0c;它会自动更新时间&#xff0c;不需要添加刷新逻辑。 布局文件&#xff0c; <?xml version"1.0"…...

【Linux Git入门】Git的介绍

文章目录 前言git简介git是什么git的作用为什么要学习git安装git总结前言 在现代软件开发中,版本控制系统已经成为了不可或缺的工具。其中,Git是最受欢迎的版本控制系统之一。Git是由Linux的创造者Linus Torvalds在2005年创建的,用于管理Linux内核的开发。Git是一个分布式版…...

kafka面试题(基础-进阶-高阶)

目录 Kafka 基础篇 1.Kafka 的用途有哪些?使用场景如何? 2.Kafka 中的ISR、AR 又代表什么?ISR 的伸缩又指什么 3.Kafka 中的 HW、LEO、LSO、LW 等分别代表什么? 4.Kafka 中是怎么体现消息顺序性的? 5.Kafka 中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序…...

《系统架构设计师教程(第2版)》第11章-未来信息综合技术-07-大数据技术概述

文章目录 1. 大数据的定义2. 大数据的研究内容2.1 面临的问题2.2 面临的挑战2.3 分析步骤2.3.1 数据获取和记录2.3.2 信息抽取和清洗2.3.3 数据集成、聚集和表示2.3.4 查询处理、数据建模和分析2.3.5 解释 3.大数据的应用领域3.1 制造业的应用3.2 服务业的应用3.3 交通行业的应…...

前端面试题54(断点续传讲解)

断点续传是一种在上传或下载大文件时&#xff0c;如果因为网络问题中断&#xff0c;可以从已经上传或下载的部分继续&#xff0c;而不是重新开始的技术。这对于提高用户体验和节省带宽非常有帮助。下面我将分别从HTTP协议层面、前端实现思路以及一个简单的前端实现示例来讲解断…...

YOLOv10改进 | Conv篇 | RCS-OSA替换C2f实现暴力涨点(减少通道的空间对象注意力机制)

一、本文介绍 本文给大家带来的改进机制是RCS-YOLO提出的RCS-OSA模块&#xff0c;其全称是"Reduced Channel Spatial Object Attention"&#xff0c;意即"减少通道的空间对象注意力"。这个模块的主要功能是通过减少特征图的通道数量&#xff0c;同时关注空…...

【C++BFS】690. 员工的重要性

本文涉及知识点 CBFS算法 LeetCode690. 员工的重要性 你有一个保存员工信息的数据结构&#xff0c;它包含了员工唯一的 id &#xff0c;重要度和直系下属的 id 。 给定一个员工数组 employees&#xff0c;其中&#xff1a; employees[i].id 是第 i 个员工的 ID。 employees[…...

视频调整帧率、分辨率+音画同步

# python data_utils/pre_video/multi_fps_crop_sync.pyimport cv2 import os from tqdm import tqdm import subprocess# 加载人脸检测模型 face_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xml)def contains_face(frame):gray …...

【深度学习】关于模型加速

模型转为半精度的会加快推理速度吗 将模型转为半精度&#xff08;通常指16位浮点数&#xff0c;即FP16&#xff09;确实可以加快推理速度&#xff0c;同时还能减少显存&#xff08;GPU内存&#xff09;的使用。以下是一些关键点&#xff1a; 加快推理速度的原因 减少计算量&a…...

Python中time模块用法示例详解

前言 仅供个人学习用&#xff0c;如果对各位朋友有参考价值&#xff0c;给个赞或者收藏吧 ^_^ 一、time模块介绍 time模块是Python中处理时间相关操作的核心工具&#xff0c;提供了时间获取、格式化、转换、延迟以及计时等多种功能。 总的来说time模块中时间可以有3种格式&…...

解决POST请求中文乱码问题

解决POST请求中文乱码问题 1、乱码原因2、解决方法3、具体步骤 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Web开发中&#xff0c;处理POST请求时经常遇到中文乱码问题&#xff0c;这主要是由于服务器在接收到POST请求的数据后&#x…...

Axure-黑马

Axure-黑马 编辑时间2024/7/12 来源&#xff1a;B站黑马程序员 需求其他根据&#xff1a;visio&#xff0c;墨刀 Axure介绍 Axure RP是美国Axure Software Solution给公司出品的一款快速原型大的软件&#xff0c;一般来说使用者会称他为Axure 应用场景 拉投资使用 给项目团…...

Centos解决服务器时间不准的问题

CentOS 系统时间老是自己变化可能有以下几个原因&#xff1a; 硬件时钟问题&#xff1a;服务器的硬件时钟可能出现故障或不准确。 时区设置错误&#xff1a;如果时区设置不正确&#xff0c;可能导致显示的时间与实际期望的时间不符。 系统服务异常&#xff1a;与时间同步相关…...

摸鱼大数据——Kafka——Kafka的shell命令使用

Kafka本质上就是一个消息队列的中间件的产品&#xff0c;主要负责消息数据的传递。也就说学习Kafka 也就是学习如何使用Kafka生产数据&#xff0c;以及如何使用Kafka来消费数据 topics操作 注意: 创建topic不指定分区数和副本数,默认都是1个 分区数可以后期通过alter增大,但是…...

在 Linux/Debian/Ubuntu 上使用 Brasero 刻录光盘

在 Ubuntu 系统中&#xff0c;Brasero 是一个非常方便的光盘刻录工具。无论是创建数据光盘、音频光盘还是刻录光盘镜像文件&#xff0c;Brasero 都能轻松胜任。本文将介绍如何在 Ubuntu 上安装和使用 Brasero 进行光盘刻录。 安装 Brasero 在大多数 Ubuntu 版本中&#xff0c…...

QT之嵌入外部第三方软件到本窗体中

一、前言 使用QT开发&#xff0c;有时需要调用一些外部程序&#xff0c;但是单独打开一个外部窗口有的场合很不合适&#xff0c;最好是嵌入到开发的QT程序界面中。还有就是自己开发的n个程序&#xff0c;一个主程序托n个子程序&#xff0c;为了方便管理将各个程序独立&#xf…...

解决GET请求中文乱码问题

解决GET请求中文乱码问题 1、乱码的根本原因2、解决方法方法一&#xff1a;修改Tomcat配置&#xff08;推荐&#xff09;方法二&#xff1a;使用URLEncoder和URLDecoder&#xff08;不推荐用于GET请求乱码&#xff09;方法三&#xff1a;String类编解码&#xff08;不直接解决乱…...

弥合人类与人工智能的知识差距:AlphaZero 中的概念发现和迁移(1)

文章目录 一、摘要二、简介三、相关工作3.1 基于概念的解释3.2 强化学习中生成解释3.3 国际象棋与人工智能 四、什么是概念&#xff1f;五、发掘概念5.1 挖掘概念向量5.1.1 静态概念的概念约束5.1.2 动态概念的概念约束 5.2 过滤概念 一、摘要 人工智能&#xff08;AI&#xff…...

cpp的cbp

.cbp 文件是 Code::Blocks 的项目文件。Code::Blocks 是一个开源的跨平台集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于 C、C 以及 Fortran 编程。.cbp 文件包含有关项目的所有配置信息&#xff0c;包括文件路径、编译选项、链接器设置等。 以下是 .cbp 文件的…...

jQuery 选择器

jQuery 选择器 jQuery 是一个快速、小巧且功能丰富的 JavaScript 库。它使得 HTML 文档遍历和操作、事件处理、动画和 AJAX 等操作更加简单,适用于各种浏览器。jQuery 的核心特性之一是其强大的选择器引擎,它允许开发者通过 CSS 选择器语法轻松地选取和操作 DOM 元素。本文将…...

Linux系统编程-进程控制相关操作详解

进程&#xff08;Process&#xff09;是计算机科学中一个基本的概念&#xff0c;特别是在操作系统领域中非常重要。它指的是在系统中正在运行的一个程序的实例。每个进程都是系统资源分配的基本单位&#xff0c;是程序执行时的一个实例。以下是关于进程的详细解释&#xff1a; …...

分布式I/O从站的认知

为什么需要分布式I/O从站&#xff1f; 当PLC与控制机构距离过远时&#xff0c;远距离会带来信号干扰&#xff0c;分布式I/O从站只需要一个网络线缆连接。 ET200分布式I/O从站家族 体积紧凑、功能强大。 ET200SP ET200M ET200S ET200iSP ET200 AL ET200pro ET200 eco PN 通讯协议…...