【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. 将从客户端接收服务器发送的响应打印在控制台

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

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

相关文章

Spring Cloud Alibaba AI 介绍及使用

一、Spring Cloud Alibaba AI 介绍 Spring AI 是 Spring 官方社区项目&#xff0c;旨在简化 Java AI 应用程序开发&#xff0c;让 Java 开发者像使用 Spring 开发普通应用一样开发 AI 应用。而 Spring Cloud Alibaba AI 是阿里以 Spring AI 为基础&#xff0c;并在此基础上提供…

dive deeper into tensor:从底层开始学习tensor

inspired by karpathy/micrograd: A tiny scalar-valued autograd engine and a neural net library on top of it with PyTorch-like API (github.com)and Taking PyTorch for Granted | wh (nrehiew.github.io). 这属于karpathy的karpathy/nn-zero-to-hero: Neural Networks…

阐述 C 语言中的参数传递机制

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

多表查询sql

概述&#xff1a;项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系&#xff0c;分为三种&#xff1a; 一对多多对多一对一 一、多表关系 一对多 案例&#xff1a;部门与…

【PowerShell】-1-快速熟悉并使用PowerShell

目录 PowerShell是什么&#xff1f;和CMD的区别&#xff1f; PowerShell的演变 自动化IT管理任务 一些名词 详尽的PowerShell开始之路 1.打开PowerShell&#xff1a; 2.基本命令&#xff1a; &#xff08;1&#xff09;Get-Process &#xff08;2&#xff09;变量赋值…

【核心笔记】Java入门到起飞,小白都能看懂的Java教程 (五)——数组

一 数组的定义和初始化 定义数组 数据类型[] 数组名&#xff1b;例 int[] arr; 数据类型 数组名[]&#xff1b;例 int arr[]; 数组初始化 数据类型[] 数组名 new 数据类型[] {值}&#xff1b;例 int[] arr new int[] {1,2,3}; &#xff08;简化形式&#xff09;数据类型[] 数…

超赞!只需粘贴复制超赞,视频快速转换成文章

大家好&#xff01;我是闷声轻创&#xff01;是否还在为撰写高质量的文章而熬夜奋战&#xff1f;今天&#xff0c;我要给你们带来一个超级棒的消息——视频变文章的神奇工具&#xff0c;让你的创作之路从此不再艰辛&#xff01; 视频素材的宝藏——油管&#xff08;YTB&#xf…

2024年了还在学pytestday1

1、按照博主的说法&#xff0c;提出疑问&#xff1a;应该在电脑本地终端安装还是在pythoncharm终端安装&#xff1f; ------在pythoncharm终端安装就行 避免老是忘记&#xff0c;还是记下来比较好。 2、在公司安装不成功&#xff0c;换豆瓣源也不行&#xff0c;连接手机热点尝…

Linux--安装VMware步骤

安装VMware VMware Desktop Hypervisors for Windows, Linux, and Mac 复制链接打开浏览器下载即可 从官网下载软件&#xff0c;完成后为确保后续正常使用&#xff0c;需要检查虚拟网卡是否安装完成 检查虚拟网卡的安装步骤 Windows--设置--高级设置--网络适配器--看是否有显…

STM32杂交版(HAL库、音乐盒、闹钟、点阵屏、温湿度)

一、设计描述 本设计精心构建了一个以STM32MP157A高性能单片机为核心控制单元的综合性嵌入式系统。该系统巧妙融合了蜂鸣器、数码管显示器、点阵屏、温湿度传感器、LED指示灯以及按键等多种外设模块&#xff0c;形成了一个功能丰富、操作便捷的杂交版智能设备。通过串口…

vue2学习笔记-官网使用指南和搭建开发环境

官网使用指南 官网地址&#xff1a;介绍 — Vue.js 1、学习 1.1 教程和API 最重要的两个板块。API是VUE的字典&#xff0c;需要时来查阅。 1.2、风格指南 如何写出风格优雅的VUE代码。规则分为四类&#xff1a;必要的&#xff0c;强烈推荐、推荐、谨慎使用。 1.3、示例 …

初始网络知识

前言&#x1f440;~ 上一章我们介绍了使用java代码操作文件&#xff0c;今天我们来聊聊网络的一些基础知识点&#xff0c;以便后续更深入的了解网络 网络 局域网&#xff08;LAN&#xff09; 广域网&#xff08;WAN&#xff09; 路由器 交换机 网络通信基础 IP地址 端…

PCI PTS 硬件安全模块(HSM)模块化安全要求 v5.0

符合条件的 PCI SSC 利益相关者在 30 天的意见征询 (RFC) 期间审查 PCI PTS 硬件安全模块 (HSM) 模块化安全要求 v5.0 草案并提供反馈。 PCI PTS 硬件安全模块(HSM)模块化安全要求 v5.0图 从 7 月 8 日到 8 月 8 日&#xff0c;邀请符合条件的 PCI SSC 利益相关者在 30 天的意见…

C语言 结构体和共用体——结构体所占内存的字节数

目录 结构体所占内存的字节数 结构体所占内存的字节数

Unity之OpenXR+XR Interaction Toolkit实现 Gaze眼部追踪

使用 Unity OpenXR 实现Gaze眼部追踪 在虚拟现实(VR)和增强现实(AR)应用中,眼动追踪是一项强大而受欢迎的技术。它可以让开发者更好地理解用户的注意力和行为,并创造出更加沉浸和智能的体验。在本文中,我们将探讨如何使用 Unity OpenXR 实现Gaze眼部追踪功能。 Unity …

Linux文件:EXT2文件系统工作原理 软硬链接

Linux文件&#xff1a;文件系统究竟是什么&#xff1f;如何管理文件&#xff1f; 前言一、磁盘结构、存储策略1.1 磁盘存储结构1.2 磁盘存储策略1.3 磁盘的逻辑存储结构 二、如何管理磁盘文件三、如何管理组3.1 每个组保存的数据种类3.2 如何管理数据1、节点表&#xff08;inod…

智慧城市可视化页面怎么做?免费可视化工具可以帮你

智慧城市是一个综合性的概念&#xff0c;广泛应用于各个领域&#xff0c;如基础设施建设、信息化应用、产业经济发展、市民生活品质等。 可视化页面的制作也是一个综合性的过程&#xff0c;需要确定展示内容、数据收集与处理、设计可视化元素等多个环节紧密配合。 1. 明确展示…

从零开始开发视频美颜SDK:实现直播美颜效果

因此&#xff0c;开发一款从零开始的视频美颜SDK&#xff0c;不仅可以节省成本&#xff0c;还能根据具体需求进行个性化调整。本文将介绍从零开始开发视频美颜SDK的关键步骤和实现思路。 一、需求分析与技术选型 在开发一款视频美颜SDK之前&#xff0c;首先需要进行详细的需求…

python对点云可视化设置颜色

1、背景介绍 点云分类/分割时&#xff0c;常需要对分类结果进行可视化&#xff0c;其中给点云赋予不同颜色是一种最直接方法。介绍基于python中matplotlib进行点云颜色渲染显示。 2、点云颜色渲染 2.1 有限种颜色渲染 matplotlib在点云颜色渲染时&#xff0c;使用表示颜色的关…

【代码随想录】【算法训练营】【第65天】 [卡码94]城市间货物运输I

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 65&#xff0c;周四&#xff0c;继续ding~ [卡码94] 城市间货物运输I 题目描述 卡码94 城市间货物运输I 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 Be…