第三十六节 Java 网络编程
网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。
java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。
java.net包中提供了两种常见的网络协议的支持:
- TCP: TCP是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称TCP / IP。
- UDP:UDP是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。
本教程主要讲解以下两个主题。
- Socket 编程: 这是使用最广泛的网络概念,它已被解释地非常详细
- URL 处理:
Java URL处理
URL(Uniform Resource Locator)中文名为统一资源定位符,有时也被俗称为网页地址。表示为互联网上的资源,如网页或者FTP地址。
本章节我们将介绍Java是如处理URL的。URL可以分为如下几个部分。
protocol://host:port/path?query#ref
protocols(协议)可以是 HTTP, HTTPS, FTP, 和File。port 为端口号。path为文件路径及文件名。
HTTP协议的URL实例如下:
http://www.w3cschool.cn/index.html?language=cn#j2se
以上URL实例并未指定端口,因为HTTP协议默认的端口号为80。
URL 类方法
在java.net包中定义了URL类,该类用来处理有关URL的内容。对于URL类的创建和使用,下面分别进行介绍。
java.net.URL提供了丰富的URL构建方式,并可以通过java.net.URL来获取资源。
| 序号 | 方法描述 |
|---|---|
| 1 | public URL(String protocol, String host, int port, String file) throws MalformedURLException. 通过给定的参数(协议、主机名、端口号、文件名)创建URL。 |
| 2 | public URL(String protocol, String host, String file) throws MalformedURLException 使用指定的协议、主机名、文件名创建URL,端口使用协议的默认端口。 |
| 3 | public URL(String url) throws MalformedURLException 通过给定的URL字符串创建URL |
| 4 | public URL(URL context, String url) throws MalformedURLException 使用基地址和相对URL创建 |
URL类中包含了很多方法用于访问URL的各个部分,具体方法及描述如下:
| 序号 | 方法描述 |
|---|---|
| 1 | public String getPath() 返回URL路径部分。 |
| 2 | public String getQuery() 返回URL查询部分。 |
| 3 | public String getAuthority() 获取此 URL 的授权部分。 |
| 4 | public int getPort() 返回URL端口部分 |
| 5 | public int getDefaultPort() 返回协议的默认端口号。 |
| 6 | public String getProtocol() 返回URL的协议 |
| 7 | public String getHost() 返回URL的主机 |
| 8 | public String getFile() 返回URL文件名部分 |
| 9 | public String getRef() 获取此 URL 的锚点(也称为"引用")。 |
| 10 | public URLConnection openConnection() throws IOException 打开一个URL连接,并运行客户端访问资源。 |
实例
以上实例演示了使用java.net的URL类获取URL的各个部分参数:
// 文件名 : URLDemo.javaimport java.net.*;
import java.io.*;public class URLDemo
{public static void main(String [] args){try{URL url = new URL("http://www.w3cschool.cn/index.html?language=cn#j2se");System.out.println("URL is " + url.toString());System.out.println("protocol is "+ url.getProtocol());System.out.println("authority is "+ url.getAuthority());System.out.println("file name is " + url.getFile());System.out.println("host is " + url.getHost());System.out.println("path is " + url.getPath());System.out.println("port is " + url.getPort());System.out.println("default port is "+ url.getDefaultPort());System.out.println("query is " + url.getQuery());System.out.println("ref is " + url.getRef());}catch(IOException e){e.printStackTrace();}}
}
以上实例编译运行结果如下:
URL is //www.w3cschool.cn/index.html?language=cn#j2se
protocol is http
authority is www.w3cschool.cn
file name is /index.htm?language=cn
host is www.w3cschool.cn
path is /index.html
port is -1
default port is 80
query is language=cn
ref is j2se
URLConnections 类方法
openConnection() 返回一个 java.net.URLConnection。
例如:
-
如果你连接HTTP协议的URL, openConnection() 方法返回 HttpURLConnection 对象。
-
如果你连接的URL为一个 JAR 文件, openConnection() 方法将返回 JarURLConnection 对象。
-
等等...
URLConnection 方法列表如下:
| 序号 | 方法描述 |
|---|---|
| 1 | Object getContent() 检索URL链接内容 |
| 2 | Object getContent(Class[] classes) 检索URL链接内容 |
| 3 | String getContentEncoding() 返回头部 content-encoding 字段值。 |
| 4 | int getContentLength() 返回头部 content-length字段值 |
| 5 | String getContentType() 返回头部 content-type 字段值 |
| 6 | int getLastModified() 返回头部 last-modified 字段值。 |
| 7 | long getExpiration() 返回头部 expires 字段值。 |
| 8 | long getIfModifiedSince() 返回对象的 ifModifiedSince 字段值。 |
| 9 | public void setDoInput(boolean input) URL 连接可用于输入和/或输出。如果打算使用 URL 连接进行输入,则将 DoInput 标志设置为 true;如果不打算使用,则设置为 false。默认值为 true。 |
| 10 | public void setDoOutput(boolean output) URL 连接可用于输入和/或输出。如果打算使用 URL 连接进行输出,则将 DoOutput 标志设置为 true;如果不打算使用,则设置为 false。默认值为 false。 |
| 11 | public InputStream getInputStream() throws IOException 返回URL的输入流,用于读取资源 |
| 12 | public OutputStream getOutputStream() throws IOException 返回URL的输出流, 用于写入资源。 |
| 13 | public URL getURL() 返回 URLConnection 对象连接的URL |
实例
以下实例中URL采用了HTTP 协议。 openConnection 返回HttpURLConnection对象。
// 文件名 : URLConnDemo.javaimport java.net.*;
import java.io.*;
public class URLConnDemo
{public static void main(String [] args){try{URL url = new URL("http://www.w3cschool.cn");URLConnection urlConnection = url.openConnection();HttpURLConnection connection = null;if(urlConnection instanceof HttpURLConnection){connection = (HttpURLConnection) urlConnection;}else{System.out.println("Please enter an HTTP URL.");return;}BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String urlString = "";String current;while((current = in.readLine()) != null){urlString += current;}System.out.println(urlString);}catch(IOException e){e.printStackTrace();}}
}
以上实例编译运行结果如下:
$ java URLConnDemo.....a complete HTML content of home page of amrood.com.....
Socket 编程
套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。
当连接建立时,服务器会创建一个Socket对象。客户端和服务器现在可以通过对Socket对象的写入和读取来进行通信。
java.net.Socket类代表一个套接字,并且java.net.ServerSocket类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。
以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:
- 服务器实例化一个ServerSocket对象,表示通过服务器上的端口通信。
- 服务器调用 ServerSocket类 的accept()方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
- 服务器正在等待时,一个客户端实例化一个Socket对象,指定服务器名称和端口号来请求连接。
- Socket类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个Socket对象能够与服务器进行通信。
- 在服务器端,accept()方法返回服务器上一个新的socket引用,该socket连接到客户端的socket。
连接建立后,通过使用I/O流在进行通信。每一个socket都有一个输出流和一个输入流。客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。
TCP是一个双向的通信协议,因此数据可以通过两个数据流在同一时间发送.以下是一些类提供的一套完整的有用的方法来实现sockets。
ServerSocket 类的方法
服务器应用程序通过使用java.net.ServerSocket类以获取一个端口,并且侦听客户端请求。
ServerSocket类有四个构造方法:
| 序号 | 方法描述 |
| 1 | public ServerSocket(int port) throws IOException 创建绑定到特定端口的服务器套接字。 |
| 2 | public ServerSocket(int port, int backlog) throws IOException 利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。 |
| 3 | public ServerSocket(int port, int backlog, InetAddress address) throws IOException 使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。 |
| 4 | public ServerSocket() throws IOException 创建非绑定服务器套接字。 |
创建非绑定服务器套接字。 如果ServerSocket构造方法没有抛出异常,就意味着你的应用程序已经成功绑定到指定的端口,并且侦听客户端请求。
这里有一些ServerSocket类的常用方法:
| 序号 | 方法描述 |
| 1 | public int getLocalPort() 返回此套接字在其上侦听的端口。 |
| 2 | public Socket accept() throws IOException 侦听并接受到此套接字的连接。 |
| 3 | public void setSoTimeout(int timeout) 通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位。 |
| 4 | public void bind(SocketAddress host, int backlog) 将 ServerSocket 绑定到特定地址(IP 地址和端口号)。 |
Socket 类的方法
java.net.Socket类代表客户端和服务器都用来互相沟通的套接字。客户端要获取一个Socket对象通过实例化 ,而 服务器获得一个Socket对象则通过accept()方法的返回值。
Socket类有五个构造方法.
| 序号 | 方法描述 |
| 1 | public Socket(String host, int port) throws UnknownHostException, IOException. 创建一个流套接字并将其连接到指定主机上的指定端口号。 |
| 2 | public Socket(InetAddress host, int port) throws IOException 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 |
| 3 | public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException. 创建一个套接字并将其连接到指定远程主机上的指定远程端口。 |
| 4 | public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException. 创建一个套接字并将其连接到指定远程地址上的指定远程端口。 |
| 5 | public Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字 |
当Socket构造方法返回,并没有简单的实例化了一个Socket对象,它实际上会尝试连接到指定的服务器和端口。
下面列出了一些感兴趣的方法,注意客户端和服务器端都有一个Socket对象,所以无论客户端还是服务端都能够调用这些方法。
| 序号 | 方法描述 |
| 1 | public void connect(SocketAddress host, int timeout) throws IOException 将此套接字连接到服务器,并指定一个超时值。 |
| 2 | public InetAddress getInetAddress() 返回套接字连接的地址。 |
| 3 | public int getPort() 返回此套接字连接到的远程端口。 |
| 4 | public int getLocalPort() 返回此套接字绑定到的本地端口。 |
| 5 | public SocketAddress getRemoteSocketAddress() 返回此套接字连接的端点的地址,如果未连接则返回 null。 |
| 6 | public InputStream getInputStream() throws IOException 返回此套接字的输入流。 |
| 7 | public OutputStream getOutputStream() throws IOException 返回此套接字的输出流。 |
| 8 | public void close() throws IOException 关闭此套接字。 |
InetAddress 类的方法
这个类表示互联网协议(IP)地址。下面列出了Socket编程时比较有用的方法:
| 序号 | 方法描述 |
| 1 | static InetAddress getByAddress(byte[] addr) 在给定原始 IP 地址的情况下,返回 InetAddress 对象。 |
| 2 | static InetAddress getByAddress(String host, byte[] addr) 根据提供的主机名和 IP 地址创建 InetAddress。 |
| 3 | static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。 |
| 4 | String getHostAddress() 返回 IP 地址字符串(以文本表现形式)。 |
| 5 | String getHostName() 获取此 IP 地址的主机名。 |
| 6 | static InetAddress getLocalHost() 返回本地主机。 |
| 7 | String toString() 将此 IP 地址转换为 String。 |
Socket 客户端实例
如下的GreetingClient 是一个客户端程序,该程序通过socket连接到服务器并发送一个请求,然后等待一个响应。
// 文件名 GreetingClient.javaimport java.net.*;
import java.io.*;public class GreetingClient
{public static void main(String [] args){String serverName = args[0];int port = Integer.parseInt(args[1]);try{System.out.println("Connecting to " + serverName+ " on port " + port);Socket client = new Socket(serverName, port);System.out.println("Just connected to "+ client.getRemoteSocketAddress());OutputStream outToServer = client.getOutputStream();DataOutputStream out =new DataOutputStream(outToServer);out.writeUTF("Hello from "+ client.getLocalSocketAddress());InputStream inFromServer = client.getInputStream();DataInputStream in =new DataInputStream(inFromServer);System.out.println("Server says " + in.readUTF());client.close();}catch(IOException e){e.printStackTrace();}}
}
Socket 服务端实例
如下的GreetingServer 程序是一个服务器端应用程序,使用Socket来监听一个指定的端口。
// 文件名 GreetingServer.javaimport java.net.*;
import java.io.*;public class GreetingServer extends Thread
{private ServerSocket serverSocket;public GreetingServer(int port) throws IOException{serverSocket = new ServerSocket(port);serverSocket.setSoTimeout(10000);}public void run(){while(true){try{System.out.println("Waiting for client on port " +serverSocket.getLocalPort() + "...");Socket server = serverSocket.accept();System.out.println("Just connected to "+ server.getRemoteSocketAddress());DataInputStream in =new DataInputStream(server.getInputStream());System.out.println(in.readUTF());DataOutputStream out =new DataOutputStream(server.getOutputStream());out.writeUTF("Thank you for connecting to "+ server.getLocalSocketAddress() + "\nGoodbye!");server.close();}catch(SocketTimeoutException s){System.out.println("Socket timed out!");break;}catch(IOException e){e.printStackTrace();break;}}}public static void main(String [] args){int port = Integer.parseInt(args[0]);try{Thread t = new GreetingServer(port);t.start();}catch(IOException e){e.printStackTrace();}}
}
编译以上 java 代码,并执行以下命令来启动服务,使用端口号为 6066:
$ java GreetingServer 6066
Waiting for client on port 6066...
像下面一样开启客户端:
$ java GreetingClient localhost 6066
Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
Server says Thank you for connecting to /127.0.0.1:6066
Goodbye!
相关文章:
第三十六节 Java 网络编程
网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。 java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注…...
DRF的认证、权限、限流、序列化、反序列化
DRF的认证、权限、限流、序列化、反序列化 一、认证1、直接用,用户授权2、认证组件源码 二、权限1. 直接使用,用户权限2.权限组件源码 三、序列化1. 序列化1.1 自定义Serailizer类序列化1.2 在视图APIView中使用1.3 自定义ModelSerializer类序列化1.4 不…...
解决:Cannot read properties of undefined (reading ‘validate‘)问题
问题:Element UI使用表单校验功能控制台出现Cannot read properties of undefined (reading validate)报错 解决:在 <el-form :model"form" :rules"rules">添加 ref"form",form为自定义的表单名称 <…...
关于IP地址发展历程的详细探讨
IP地址的发展历程是一段不断演进、适应网络技术发展的历史。自互联网诞生以来,IP地址作为网络设备的唯一标识,扮演了至关重要的角色。以下是对IP地址发展历程的详细探讨。 在互联网的初期,主机数量相对较少,IP地址主要用于区分不…...
【LeetCode热题100】【二叉树】将有序数组转换为二叉搜索树
题目链接:108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode) 取中间的数作为根节点,左边的数递归转换,右边的数递归转换 class Solution { public:TreeNode *sortedArrayToBST(vector<int> &nums) {retur…...
文心一言和GPT-4全面比较
自大型语言模型出现以来,人工智能在自然语言处理方面取得了显著进步。文心一言和GPT-4是当前最先进的两款语言模型,在业内广受关注。两者都具有强大的能力,但各有特点和优势。本文将从多个方面对这两个模型进行全面比较,以帮助读者…...
Mac的终端配置
Mac的终端配置 参考教程包管理工具 - Homebrew出现的问题用虚拟环境解决方案:直接将解释器的路径放过去错误方法:用find查找到虚拟环境安装的路径,其链接的是brew安装的python路径 编辑器没有报错,但是运行过程中仍然找不到pandas…...
制作一个RISC-V的操作系统十-Trap和Exception(流 mtvec mepc mcause mtval mstatus trap完整流程)
文章目录 流mtvecmepcmcausemtvalmstatustrap 初始化trap的top half(硬件完成)trap的bottom half(软件完成)从trap返回代码实现 流 控制流:程序控制的执行流 trap分为中断和异常 mtvec base:存储trap入…...
【爬虫开发】爬虫从0到1全知识md笔记第4篇:Selenium课程概要,selenium的介绍【附代码文档】
爬虫开发从0到1全知识教程完整教程(附代码资料)主要内容讲述:爬虫课程概要,爬虫基础爬虫概述,,http协议复习。requests模块,requests模块1. requests模块介绍,2. response响应对象,3. requests模块发送请求,4. request…...
对一个时间序列中的每个元素按照指定精度向上取整
【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 对一个时间序列中的每个元素 按照指定精度向上取整 例如:对小时处理, 则9:01处理为10:00 Series.dt.ceil() 选择题 以下代码的输出结果中正确的是? import pandas as…...
51单片机+TN901非接触式红外测温设计论文与源码PCB等资料
1、摘要 温度测量技术应用十分广泛,而且在现代设备故障检测领域中也是一项非常重要的技术。但在某些应用领域中,要求测量温度用的传感器不能与被测物体相接触,这就需要一种非接触的测温方式来满足上述测温需求。本论文正是应上述实际需求而设…...
AI创业项目:AI旅游规划定制师
在当前的旅游市场中,个性化旅游规划成为越来越多旅行者的需求。然而,现行的定制旅行服务主要依赖于人工定制师,这一模式面临着信息不透明、价格弹性大等挑战。定制师在客户与服务供应商之间掌握着信息差,依靠这一优势获得收益&…...
win 安装 Stable Diffusion
注:本人使用的是 RTX2060 - 6G版 特别提醒:安装一定要 CUDA 和 PyTorch 版本能配套用,不然会有生成保存问题(我是这样的),装完用 python -m xformers.info 这个看对应的版本 建议:有些命令安装在venv 虚拟机中做&…...
STM32F407+FreeRTOS+LWIP UDP组播
开发环境介绍: MCU:STM32F407ZET6 网卡:LAN8720A LWIP版本:V1.1.0 FreeRTOS 版本:V10.2.1 LAN8720A硬件原理图: 硬件连接说明: MII_RX_CLK/RMII_REF_CLK ------>PA1 …...
(源码+部署+讲解)基于Spring Boot + Vue的车位租赁系统设计与实现
前言 💗博主介绍:✌专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2024年Java精品实战案例《100套》 🍅文末获取源码联系🍅 🌟…...
Lecture 2~4 About Filter
文章目录 空间域上的滤波器- 线性滤波器盒状滤波器Box Filter锐化Sharpening相关运算 vs. 卷积运算 Correlation vs. Convolution - 非线性滤波器高斯滤波器Gaussian filter - 实际问题- 纹理texture 频域上的滤波器 滤波的应用- 模板匹配- 图像金字塔 空间域上的滤波器 图像…...
【LINUX】Linux 命令大全:系统管理与网络操作指南
开始之前 Linux命令行,也称为终端,是Linux最强大的特性之一。通过命令行,用户可以执行几乎所有的任务,比如文件操作、程序安装、系统监控和网络配置等。了解这些基本命令,将帮助你更好地掌握Linux系统。 文件和目录操…...
Day50 动态规划 part11
Day50 动态规划 part11 123.买卖股票的最佳时机III 我的思路: 这道题考虑了交易次数 j(最大次数为2),以及某天 i 应该买or卖股票(两种状态) 用三维数组表示 dp[i][j][0] – 第i天结束时,交易j…...
Docker 搭建私有镜像仓库
一、镜像仓库简介 Docker的镜像仓库是一个用于存储和管理Docker镜像的中央位置。镜像仓库的主要作用是提供一个集中的地方,让用户可以上传、下载、删除和共享Docker镜像。镜像仓库又可以分为公共镜像仓库和私有仓库镜像仓库: 公共镜像仓库 Docker Hub 是…...
Nginx反向代理与Tomcat实现ssm项目前后端分离部署
Nginx nginx是一款http和支持反向代理的web服务器,以其优越的性能被广泛使用。以下是百度百科的介绍。 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
