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

Java基础14-网络编程

十四、网络编程

java.net.*包下提供了网络编程的解决方案!

基本的通信架构

基本的通信架构有2种形式: CS架构( Client客户端/Server服务端)、BS架构(Browser浏 览器/Server服务端)。无论是CS架构,还是BS架构的软件都必须依赖网络编程!。

1、网络通信的三要素

网络通信的三要素:IP地址、端口、协议。

1.1 InetAddress

代表IP地址,是一个操作IP地址的类。

InetAddress的常用方法说明
public static InetAddress getLocalHost()获取本机IP,会以一个InetAddress对象返回
public static InetAddress getByName( String host )根据ip地址或者域名,返回一个InetAddress对象
public String getHostName()获取指定IP对象对应的主机名
public String getHostAddress()获取指定IP地址对象中的IP地址信息
public boolean isReachable(int timeout )在指定毫秒内,判断主机与该IP对应的主机是否能连通
public class InetAddressTest   {public static void main(String[] args) throws Exception {//获取本机IP地址对象InetAddress  localhost=InetAddress.getLocalHost();//获取指定IP对象的IP地址String   lip=  localhost.getHostAddress();//获取指定IP对象的主机名String   name=localhost.getHostName();System.out.println(lip);System.out.println(name);//获取指定IP地址或域名的Ip对象InetAddress   baidu= InetAddress.getByName("www.baidu.com");//获取指定IP对象的IP地址System.out.println(baidu.getHostAddress());//获取指定IP对象的主机名System.out.println(baidu.getHostName());//判断指定IP对象在1秒内是否与本机是否可以连通boolean  isComm=baidu.isReachable(1000);System.out.println(isComm);}
}
1.2、端口

端口号:标记正在计算机设备.上运行的应用程序的,被规定为-个16位的二进制,范围是0~65535。

周知端口:0~1023,被预先定义的知名应用占用(如: HTTP占用80,FTP占用21)

注册端口: 1024~49151,分配给用户进程或某些应用程序。

动态端口: 49152到65535,之所以称为动态端口,是因为它-般不固定分配某种进程,而是动态分配。

注意:我们自己开发的程序-般选择使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错。

1.3、协议

开放式网络互联标准::OSI网络参考模型,是全球网络互联标准。

TCP/IP网络模型:事实.上的国际标准。

UDP(User Datagram Protocol): 用户数据报协议; TCP(Transmission Control Protocol) :传输控制协议。

在这里插入图片描述

1.3.1 UDP协议

特点::通信效率搞、无连接、不可靠通信。

不事先建立连接,数据按照包发,一包数据包含:自己的IP、程序端口,目的地IP、程序端口和数据(限制在64KB内),超过就分包发送。

发送方不管对方是否在线,数据在中间丢失也不管,如果接收方收到数据也不返回确认,故是不可靠的。

场景:视频语音通话、网络直播。

1.3.2、TCP协议

特点:通信效率相对不高、面向连接、可靠通信。

TCP的最终目的:要保证在不可靠的信道上实现可靠的传输。

TCP主要有三个步 骤实现可靠传输:三次握手建立连接,传输数据进行确认,四次挥手断开连接。

场景:文件下载、网页、支付。

2、UDP通信

特点:无连接、不可靠通信。

不事先建立连接,发送端每次把要发送的数据(限制在64KB内)、接收端IP、 等信息封装成一个数据包, 发出去就不管了。

Java提供了一个java.net.DatagramSocket类来实现UDP通信。

DatagramSocket:用于创建客户端、服务端

构造器说明
public DatagramSocket()创建客户端的Socket对象,系统会随机分配一个端口号
public DataGramSocket( int port )创建服务器的Socket对象,并指定端口号
DatagramSocket对象提供的方法说明
public void send(DatagramPacket dp)发送数据包
public void receive( DatagramPacket p )使用数据包接收数据

DatagramPacket:创建数据包

构造器说明
public DatagramPacket(byte[] buf , int length , InetAddress address , int port )创建发出去的数据包对象
public DatagramPacket(byte[] buf , int length )创建用来接收数据的数据包
方法说明
public int getLength()获取数据包,实际接收到的字节个数

1、客户端向服务端发送UDP信息——一发一收

//客户端
public class Client {public static void main(String[] args) throws Exception {//1、获取客户端对象DatagramSocket  socket=new DatagramSocket();//2、准备数据,将字符串转为字符数组byte[]  hi= "你好Java,Hello Java".getBytes();//3、创建发送数据的数据包,参数:(发送数据的字节数组,数据字节大小,接收方的IP地址对象(这里是本机),接收方开放的端口)DatagramPacket packet=new DatagramPacket(hi,hi.length, InetAddress.getLocalHost(),6060);//4、调用客户端对象的发送方法,将数据包对象作为参数,发送数据。socket.send(packet);//5、关闭发送接口socket.close();System.out.println("客户端发送完毕!");}
}
//服务端
public class Service {public static void main(String[] args) throws Exception {//1、创建服务端的对象(端口号要和客户端一样)DatagramSocket socket=new DatagramSocket(6060);System.out.println("-----服务端启动----");//限制接收数据的字节数(最大64kb)byte[]  buffer=new byte[1024*64];//2、创建接收数据包的对象,参数(接收字节的数组,限制接收字节的大小)DatagramPacket packet=new DatagramPacket(buffer,buffer.length);//3、通过服务端对象的方法接收数据socket.receive(packet);//4、获取到接收的数据//获取接收数据的大小int   len=packet.getLength();//由于用来装数据的数组是最大来算的(64kb),很可能装不满,所有接收多少,倒多String str=new String(buffer,0,len);System.out.println(str);//关闭服务端socket.close();}
}

2、客户端向服务端发送UDP信息——用户控制多次发送

使用死循环来实现

//客户端
public class Client {public static void main(String[] args) throws Exception {Scanner  scanner=new Scanner(System.in);//1、获取客户端对象DatagramSocket  socket=new DatagramSocket();while (true) {System.out.print("请输入发送内容:");//2、准备数据,将字符串转为字符数组String say= scanner.next();if (!say.equals("0")) {//3、创建发送数据的数据包,参数:(发送数据的字节数组,数据字节大小,接收方的IP地址对象(这里是本机),接收方开放的端口)DatagramPacket packet=new DatagramPacket(say.getBytes(),say.getBytes().length, InetAddress.getLocalHost(),6060);//4、调用客户端对象的发送方法,将数据包对象作为参数,发送数据。socket.send(packet);System.out.println("已发送!");}else {break;}}//5、关闭发送接口socket.close();}
}
//服务端
public class Service {public static void main(String[] args) throws Exception {//1、创建服务端的对象(端口号要和客户端一样)DatagramSocket socket=new DatagramSocket(6060);System.out.println("-----服务端启动----");//限制接收数据的字节数(最大64kb)byte[]  buffer=new byte[1024*64];while (true) {//2、创建接收数据包的对象,参数(接收字节的数组,限制接收字节的大小)DatagramPacket packet=new DatagramPacket(buffer,buffer.length);//3、通过服务端对象的方法接收数据socket.receive(packet);//4、获取到接收的数据//获取接收数据的大小int   len=packet.getLength();//由于用来装数据的数组是最大来算的(64kb),很可能装不满,所有接收多少,倒多String str=new String(buffer,0,len);System.out.println("已接收内容:"+str);}//关闭服务端// socket.close();}
}

3、TCP通信

特点:面向连接、可靠通信。

通信双方事先会采用“三次握手”方式建立可靠连接,实现端到端的通信;底层能保证数据成功传给服务端。

1、TCP客户端开发

Java提供了一个java.net.Socket类 来实现TCP通信。

Socket类构造器说明
public Socket(String host,int port)根据指定的服务器IP、端口号请求与服务器建立连接,连接通过,就获得了客户端socket
方法说明
public OutputStream getOutputStream( )获得字节输出流对象
public InputStream getInputStream()获得字节输入流对象
public class TcpClient {public static void main(String[] args) throws Exception {//1、创建一个Socket对象,并同时请求服务器进行连接(传入要发送给服务端的IP和对应的端口号)Socket  socket=new Socket(InetAddress.getLocalHost().getHostAddress(),6060);//2、通过调用字节输出流OutputStream os= socket.getOutputStream();//3、将原始字节输出流转为数据字节输出流(性能更好)DataOutputStream  dos=new DataOutputStream(os);//4、调用写出方法dos.writeUTF("通过TCP协议发送信息");//5、关闭字节流dos.close();//6、释放连接资源socket.close();}
}

2、TCP服务端开发

服务端是通过java.net包下的ServerSocket类来实现的。

ServerSocket类构造器说明
public ServerSocket( int port )为服务端程序注册端口
方法说明
public Socket accept()阻塞等待客户端的连接请求,一旦与某个客户端连接成功,则返回服务端这边的Socket对象
//服务端
public class TcpService {public static void main(String[] args) throws Exception {//1、创建一个服务端连接对象serverSocket,并设置服务端端口ServerSocket  serverSocket=new ServerSocket(6060);//2、调用accept方法,监测是否又客户端发起连接,连接成功,返回Socket对象Socket  socket=serverSocket.accept();//3、通过Socket对象,调用字节输入流InputStream  is=socket.getInputStream();//4、为提高性能,将原始字节流转换为数据字节流DataInputStream dis=new DataInputStream(is);//5、调用读方法,读出发送过来的数据String  str=  dis.readUTF();System.out.println(str);//6、关闭字节流dis.close();//7、释放资源serverSocket.close();}
}
3.1 TCP客户端和服务端开发-多收多发

这个案例只能接收一个程序的信息,没法实现接收多个客户端发送的信息:因为服务端现在只有一个主线程,只能处理一个客户端的消息。

//服务端
public class TcpService {public static void main(String[] args) throws Exception {System.out.println("------服务端已启动--------");//1、创建一个服务端连接对象serverSocket,并设置服务端端口ServerSocket  serverSocket=new ServerSocket(6060);//2、调用accept方法,监测是否又客户端发起连接,连接成功,返回Socket对象Socket  socket=serverSocket.accept();//3、通过Socket对象,调用字节输入流InputStream  is=socket.getInputStream();//4、为提高性能,将原始字节流转换为数据字节流DataInputStream dis = new DataInputStream(is);while (true) {//5、调用读方法,读出发送过来的数据try {String  str=  dis.readUTF();System.out.println("已接收:"+str);} catch (Exception e) {//如果客户端退出,那么服务端,会出异常,这时就可以捕获异常,进行处理(获取离线的IP)System.out.println(socket.getRemoteSocketAddress()+":已离线");//释放资源dis.close();socket.close();break;}}}
}
//客户端
public class TcpClient {public static void main(String[] args) throws Exception {//1、创建一个Socket对象,并同时请求服务器进行连接(传入要发送给服务端的IP和对应的端口号)Socket  socket=new Socket(InetAddress.getLocalHost().getHostAddress(),6060);//2、通过调用字节输出流OutputStream os= socket.getOutputStream();//3、将原始字节输出流转为数据字节输出流(性能更好)DataOutputStream  dos=new DataOutputStream(os);Scanner scanner=new Scanner(System.in);while (true) {System.out.print("请说:");String str=scanner.nextLine();if(str.equals("0")){//5、关闭字节流dos.close();//6、释放连接资源socket.close();break;}//4、调用写出方法dos.writeUTF(str);}}
}
3.2 TCP客户端和服务端开发-接收多客户端信息

通主线程接接收倒Socket对象,主线程将其交给一个子线程来处理,每多一个socket就交给一个子线程。

在这里插入图片描述

//客户端
public class TcpClient {public static void main(String[] args) throws Exception {//1、创建一个Socket对象,并同时请求服务器进行连接(传入要发送给服务端的IP和对应的端口号)Socket  socket=new Socket(InetAddress.getLocalHost().getHostAddress(),6060);//2、通过调用字节输出流OutputStream os= socket.getOutputStream();//3、将原始字节输出流转为数据字节输出流(性能更好)DataOutputStream  dos=new DataOutputStream(os);Scanner scanner=new Scanner(System.in);while (true) {System.out.print("请说:");String str=scanner.nextLine();if(str.equals("0")){//5、关闭字节流dos.close();//6、释放连接资源socket.close();break;}//4、调用写出方法dos.writeUTF(str);}}
}
//服务端
public class TcpService {public static void main(String[] args) throws Exception {System.out.println("------服务端已启动--------");//1、创建一个服务端连接对象serverSocket,并设置服务端端口ServerSocket  serverSocket=new ServerSocket(6060);Socket  socket= null;while (true) {//2、调用accept方法,监测是否又客户端发起连接,连接成功,返回Socket对象socket = serverSocket.accept();//将Socket对象交给子线程进行处理new SocketServerThread(socket).start();}}
}
//线程类
public class SocketServerThread extends Thread {
private  Socket  socket;
public SocketServerThread(Socket socket){this.socket=socket;
}@Overridepublic void run() {try {//调用Accent方法获取字节输入流InputStream is=socket.getInputStream();//将原始流转换为数据流DataInputStream dis=new DataInputStream(is);//可以获取到是哪个客户端发送的IPSystem.out.println(socket.getRemoteSocketAddress()+":已上线!");while (true) {try {//读取客户端发送的信息(只要不下线就一直处理该客户端的信息)String str= dis.readUTF();System.out.println(str);} catch (Exception e) {//下线System.out.println(socket.getRemoteSocketAddress()+":一下线!");//释放资源dis.close();socket.close();}}} catch (Exception e) {e.printStackTrace();}super.run();}
}
3.3 案例

实现群聊,一个客户端发送的信息,会被其它所有在线的客户端接收到。

每个客户端的socket还是交给服务端一个子线程进行处理,如果上线就将socket对象用集合保存起来,用来转发信息,如果下线就将其删除掉。

在这里插入图片描述

3.4 B/S架构

在这里插入图片描述

HTTP协议规定:响应给浏览器的数据格式必须满足如下格式:

在这里插入图片描述

通过浏览器进行访问直接访问环路地址加端口(127.0.0.1:8080)

//服务端
public class Server {public static void main(String[] args) throws Exception {System.out.println("------服务端启动-------");//1、创建一个serverSocket对象,开放服务器端口ServerSocket serverSocket=new ServerSocket(8080);//2、创建一个线程池,防止高并发ThreadPoolExecutor pool=new ThreadPoolExecutor(4*2,4*2,5, TimeUnit.MINUTES,new ArrayBlockingQueue<>(8), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());while (true) {//3、通过serverSocket对象获取socket对象Socket socket=serverSocket.accept();//4、创建线程对象,并将线程对象交给线程池pool.execute(new ServerRunnable(socket));}}
}
//线程类
public class ServerRunnable implements Runnable {private Socket socket;public ServerRunnable(Socket socket) {this.socket=socket;}@Overridepublic void run() {try {//1、通过传过来的socket对象获取字节输出流OutputStream os=socket.getOutputStream();//2、将原始输出流转换为输出字节流PrintStream ps=new PrintStream(os);//3、调用输出流方法,按照浏览器输出规则输出对应内容ps.println("HTTP/1.1 200 OK");ps.println("Content-Type:text/html");ps.println();   //必须换行ps.println("<div style='font-size:200px;color:green; text-align:center;'>Hello  world<div/>"); //输出html格式或者直接字符串//释放资源ps.close();socket.close();} catch (Exception e) {e.printStackTrace();}}
}

相关文章:

Java基础14-网络编程

十四、网络编程 java.net.*包下提供了网络编程的解决方案! 基本的通信架构 基本的通信架构有2种形式: CS架构( Client客户端/Server服务端)、BS架构(Browser浏 览器/Server服务端)。无论是CS架构&#xff0c;还是BS架构的软件都必须依赖网络编程!。 1、网络通信的三要素 网络通…...

sed命令详解

sed命令详解 sed&#xff08;stream editor&#xff0c;流编辑器&#xff09;是 Linux 和 Unix 系统中功能强大的文本处理工具&#xff0c;它能够对输入流&#xff08;如文件、管道输入等&#xff09;进行逐行处理&#xff0c;从而实现多种多样的文本编辑操作。 基本语法 se…...

Linux高阶——1013—正则表达式练习

1、正则表达式匹配机制 问号放在或者*后面&#xff0c;表示切换成非贪婪模式 [^>]表示非右尖括号的都能匹配&#xff0c;直到找到href"为止 [^"]表示向右匹配&#xff0c;到"为止 因此&#xff0c;三个都能匹配 2、 正则函数 寻找结果 源文件 正则函数运…...

【CMake】为可执行程序或静态库添加 Qt 资源文件,静态库不生效问题

【CMake】添加静态库中的 Qt 资源 文章目录 可执行程序1. 创建资源文件&#xff08;.qrc&#xff09;2. 修改 CMakeLists.txt3. 使用资源文件 静态库1. 修改 CMakeLists.txt2. 使用资源2.1 初始化资源文件2.2 可执行程序中调用 这里介绍的不是使用 Qt 创建工程时默认的 CMakeLi…...

服务器、jvm、数据库的CPU飙高怎么处理

服务器 CPU 飙高处理 排查步骤&#xff1a; 监控工具&#xff1a;使用操作系统自带的监控工具&#xff0c;比如 top、htop、sar、vmstat 等&#xff0c;查看哪些进程占用了大量的 CPU 资源。进程排查&#xff1a;通过 top 等工具找到消耗 CPU 最高的进程&#xff0c;确定是哪…...

自适应过滤法—初级

#课本P144例题 """ Python 简单的自适应过滤移动平均预测方法 """ import numpy as np import matplotlib.pyplot as plt#用于迭代的函数 def self_adaptive( seq, N, k, maxsteps ):## 初始化序列seq_ada = np.zeros( len(seq) ) # 设置预测…...

UML图有用吗?真正厉害的软件开发,有用的吗?什么角色用?

UML&#xff08;Unified Modeling Language&#xff0c;统一建模语言&#xff09;图在软件开发中是有用的&#xff0c;但其使用取决于项目的规模、复杂度以及开发团队的实践习惯。真正厉害的开发者并非一定要依赖UML图&#xff0c;但在某些情况下&#xff0c;UML图确实能够提升…...

基于Java+Springboot+Vue开发的酒店客房预订管理系统

项目简介 该项目是基于JavaSpringbootVue开发的酒店客房预订管理系统&#xff08;前后端分离&#xff09;&#xff0c;这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能&#xff0c;同时锻炼他们的项目设计与开发能力。通过学习基于Java…...

OpenCV高级图形用户界面(5)获取指定滑动条(trackbar)的当前位置函数getTrackbarPos()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 返回滑动条的位置。 该函数返回指定滑动条的当前位置。 cv::getTrackbarPos() 函数用于获取指定滑动条&#xff08;trackbar&#xff09;的当前…...

拓扑排序在实际开发中的应用

1. 拓扑排序说明 简单解释&#xff1a;针对于有向无环图&#xff08;DAG&#xff09;&#xff0c;给出一个可行的节点排序&#xff0c;使节点之间的依赖关系不冲突。 复杂解释&#xff1a;自行搜索相关资料。 本次应用中的解释&#xff1a;给出一个可行的计算顺序&#xff0…...

【CTF-SHOW】Web入门 Web27-身份证日期爆破 【关于bp intruder使用--详记录】

1.点进去 是一个登录系统&#xff0c;有录取名单和学籍信息 发现通过姓名和身份证号可以进行录取查询&#xff0c;推测录取查询可能得到学生对应学号和密码&#xff0c;但是身份证号中的出生日期部分未知&#xff0c;所以可以进行爆破 2.打开bp抓包 这里注意抓的是学院录取查…...

Windows 添加右键以管理员身份运行 PowerShell

在 Windows 系统中添加一个右键菜单选项&#xff0c;以便可以使用管理员权限打开 PowerShell&#xff0c;可以通过编辑注册表来实现。 打开注册表编辑器&#xff1a; 按 Win R 打开运行对话框。输入 regedit 并按回车&#xff0c;这将打开注册表编辑器。 导航到文件夹背景键&…...

数学建模算法与应用 第15章 预测方法

目录 15.1 微分方程模型 Matlab代码示例&#xff1a;求解简单的微分方程 15.2 灰色预测模型&#xff08;GM&#xff09; Matlab代码示例&#xff1a;灰色预测模型 15.3 自回归模型&#xff08;AR&#xff09; Matlab代码示例&#xff1a;AR模型的预测 15.4 指数平滑法 M…...

HC32F460KETA PETB JATA 工业 自动化 电机

HC32F460 系列是基于 ARM Cortex-M4 32-bit RISC CPU&#xff0c;最高工作频率 200MHz 的高性能 MCU。Cortex-M4 内核集成了浮点运算单元&#xff08;FPU&#xff09;和 DSP&#xff0c;实现单精度浮点算术运算&#xff0c;支持 所有 ARM 单精度数据处理指令和数据类型&#xf…...

linux系统,不定时kernel bug :soft lockup的问题

这个问题困扰好久&#xff0c;机器经常不定时卡死&#xff0c;只能重启 后来检查是因为没有安装nvidia显卡驱动&#xff0c;或者更新到最新驱动 下载地址&#xff1a;驱动详情 禁止nouveau就可以了...

【C语言教程】【常用类库】(十四)可移植库 - <unistd.h> 和 <sys/types.h>

14. 可移植库 - <unistd.h> 和 <sys/types.h> UNIX和类UNIX系统上提供的一组头文件&#xff0c;其中<unistd.h>定义了POSIX操作系统API的访问点&#xff0c;而<sys/types.h>定义了许多基础数据类型。这些库在多种环境中增强了C程序的可移植性。 14.1…...

Java项目实战II基于Spring Boot的周边游平台设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着人们生…...

远程控制软件哪个好用:4款主流的远程控制软件大点评,谁最给力?

战国时期&#xff0c;有百家争鸣&#xff0c;九流十家&#xff0c;争芳斗艳&#xff1b; 时至今日&#xff0c;科学技术突飞猛进、一日千里&#xff0c;各大远程控制软件更是佳丽三千、琳琅满目、各有千秋&#xff01; 这时&#xff0c;新的问题来了&#xff1a;远程控制软件哪…...

基于springboot实习管理系统

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;…...

(38)MATLAB分析带噪信号的频谱

文章目录 前言一、MATLAB仿真代码二、仿真结果画图总结 前言 本文给出带噪信号的时域和频域分析&#xff0c;指出频域分析在处理带噪信号时的优势。 首先使用MATLAB生成一段信号&#xff0c;并在信号上叠加高斯白噪声得到带噪信号&#xff0c;然后对带噪信号对其进行FFT变换&…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...