Day(21)--网络编程
网络编程
在网络通信协议下,不同计算机上运行的程序,进行的数据传输
-
应用场景:即使通信、网友对战、金融证券等等,不管是什么场景,都是计算机和计算机之间通过网络进行的数据传输
-
java.net
常见的软件架构
C/S(Client/Server,客户端 / 服务器)架构和 B/S(Browser/Server,浏览器 / 服务器)架构是软件开发中两种常见的软件架构模式,下面为你详细介绍:
C/S 架构
概念
C/S 架构将应用程序分为客户端和服务器两部分。客户端是用户直接交互的界面,负责处理用户的输入和显示结果;服务器则负责处理客户端的请求,提供数据存储和业务逻辑处理等服务。客户端和服务器之间通过网络进行通信。
优点
-
性能较高:客户端可以在本地处理部分业务逻辑,减少了与服务器的通信次数,因此在处理大量数据和复杂业务时性能较好。
-
用户体验好:可以根据用户的需求定制客户端界面和功能,提供更加个性化的用户体验。
-
安全性高:客户端和服务器之间的通信可以采用加密技术,数据存储在服务器端,相对比较安全。
缺点
-
维护成本高:客户端需要安装和维护,当软件更新时,需要对每个客户端进行更新,工作量较大。
-
可扩展性差:当用户数量增加或业务需求变化时,需要对客户端和服务器进行相应的升级和扩展,难度较大。
-
跨平台性差:不同操作系统的客户端需要开发不同的版本,增加了开发成本。
适用场景
-
对性能要求较高的应用,如大型游戏、图形处理软件等。
-
对数据安全性要求较高的应用,如银行的网上银行系统、企业的内部办公系统等。
B/S 架构
概念
B/S 架构是一种基于 Web 技术的架构模式,用户通过浏览器访问服务器上的应用程序。服务器负责处理所有的业务逻辑和数据存储,浏览器只负责显示页面和与用户进行交互。
优点
-
易于维护:只需要对服务器进行维护和更新,用户不需要安装任何客户端软件,通过浏览器即可访问应用程序。
-
可扩展性好:服务器可以根据用户数量和业务需求进行灵活的扩展,如增加服务器数量、升级服务器配置等。
-
跨平台性好:只要有浏览器的设备都可以访问应用程序,不受操作系统的限制。
缺点
-
性能相对较低:所有的业务逻辑都在服务器端处理,浏览器只负责显示页面,因此在处理大量数据和复杂业务时性能相对较低。
-
用户体验受浏览器限制:不同浏览器对页面的渲染效果可能会有所不同,用户体验可能会受到一定的影响。
-
安全性相对较低:由于浏览器是开放的,容易受到网络攻击,如 SQL 注入、XSS 攻击等。
适用场景
-
对维护成本要求较低、用户数量较多的应用,如电子商务网站、社交网络平台等。
-
对跨平台性要求较高的应用,如在线办公系统、在线教育平台等。
以下是一个简单的 Java 示例,分别展示 C/S 架构和 B/S 架构的基本实现。
C/S 架构示例
客户端代码:
java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class CSClient {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 8888);PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {out.println("Hello, Server!");String response = in.readLine();System.out.println("Server response: " + response);} catch (IOException e) {e.printStackTrace();}}
}
服务器端代码:
java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class CSServer {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8888)) {System.out.println("Server is listening on port 8888");try (Socket socket = serverSocket.accept();PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {String inputLine = in.readLine();System.out.println("Client message: " + inputLine);out.println("Hello, Client!");}} catch (IOException e) {e.printStackTrace();}}
}
B/S 架构示例(使用 Spring Boot)
创建一个简单的 Spring Boot 项目,包含一个控制器类:
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class BSApplication {
public static void main(String[] args) {SpringApplication.run(BSApplication.class, args);}
@GetMapping("/hello")public String hello() {return "Hello, World!";}
}
运行该 Spring Boot 应用程序后,在浏览器中访问 http://localhost:8080/hello 即可看到返回的信息。
网络编程三要素
网络编程三要素分别是 IP 地址、端口号和传输协议,以下为你详细介绍:
1. IP 地址
概念
IP 地址是互联网协议地址(Internet Protocol Address)的缩写,它是分配给网络上使用网际协议的设备的数字标签,其作用是唯一标识网络中的设备,就像现实生活中的家庭住址一样,通过 IP 地址可以在网络中找到对应的设备。
分类
-
IPv4:由 32 位二进制数组成,通常用点分十进制表示,例如
192.168.1.1。IPv4 地址数量有限,目前已经基本分配完毕。 -
IPv6:为了解决 IPv4 地址不足的问题而推出的新一代 IP 协议,由 128 位二进制数组成,通常用冒号分隔的十六进制数表示,例如
2001:0db8:85a3:0000:0000:8a2e:0370:7334。
相关代码示例(Java 获取本地 IP 地址)
java
import java.net.InetAddress;
import java.net.UnknownHostException;
public class GetLocalIP {public static void main(String[] args) {try {InetAddress localHost = InetAddress.getLocalHost();System.out.println("本地IP地址: " + localHost.getHostAddress());} catch (UnknownHostException e) {e.printStackTrace();}}
}
2. 端口号
概念
端口号是一个 16 位的整数,范围从 0 到 65535。它的作用是标识设备上的应用程序或服务,一台设备上可能同时运行多个网络应用程序,通过端口号可以区分不同的应用程序,从而将数据准确地发送到对应的应用程序。
分类
-
系统端口(0 - 1023):这些端口被系统保留,用于一些知名的服务,例如 HTTP 服务使用的端口号是 80,HTTPS 服务使用的端口号是 443。
-
注册端口(1024 - 49151):这些端口通常由用户程序或服务注册使用,例如 MySQL 数据库默认使用的端口号是 3306。
-
动态端口(49152 - 65535):这些端口用于临时分配给客户端程序,当客户端程序与服务器建立连接时,系统会从动态端口中分配一个端口号给客户端使用。
相关代码示例(Java 使用指定端口创建服务器)
java
import java.io.IOException;
import java.net.ServerSocket;
public class ServerWithPort {public static void main(String[] args) {try {int port = 8888;ServerSocket serverSocket = new ServerSocket(port);System.out.println("服务器已启动,监听端口: " + port);} catch (IOException e) {e.printStackTrace();}}
}
3. 传输协议
概念
传输协议是指在网络中传输数据时所遵循的规则和约定,它定义了数据的传输格式、传输方式、错误处理等内容。不同的传输协议适用于不同的应用场景。
常见传输协议
-
TCP(Transmission Control Protocol,传输控制协议):是一种面向连接的、可靠的、基于字节流的传输协议。在进行数据传输之前,需要先建立连接,传输完成后再断开连接。TCP 协议通过确认机制、重传机制等保证数据的可靠传输,适用于对数据准确性要求较高的场景,例如文件传输、电子邮件等。
-
UDP(User Datagram Protocol,用户数据报协议):是一种无连接的、不可靠的传输协议。它不需要建立连接,直接将数据发送出去,不保证数据的可靠传输,可能会出现数据丢失、乱序等情况。UDP 协议的传输效率较高,适用于对实时性要求较高的场景,例如视频会议、在线游戏等。
相关代码示例(Java 使用 TCP 协议实现简单的客户端和服务器通信)
服务器端代码:
java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8888)) {System.out.println("服务器已启动,等待客户端连接...");try (Socket socket = serverSocket.accept();PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {String inputLine = in.readLine();System.out.println("客户端消息: " + inputLine);out.println("Hello, Client!");}} catch (IOException e) {e.printStackTrace();}}
}
客户端代码:
java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class TCPClient {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 8888);PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {out.println("Hello, Server!");String response = in.readLine();System.out.println("服务器响应: " + response);} catch (IOException e) {e.printStackTrace();}}
}
4 IP
-
ip的作用,设备在网络中的地址,是唯一的标识
-
IPv4:目前的主流方案,最多只有2^23次方个ip,目前已经用完了
-
IPv6:为了解决IPv4不够用而出现的,最多可以有2^128次方个ip
-
利用局域网IP解决IP 不够用的问题
Inetaddress类
在 Java 中,InetAddress 类属于 java.net 包,它的主要功能是表示互联网协议(IP)地址。下面详细介绍该类的一些关键知识点:
1. 类的特点
InetAddress 类是一个抽象类,这意味着不能直接使用 new 关键字来创建它的实例。不过,它提供了多个静态方法来获取 InetAddress 实例。
2. 获取 InetAddress 实例
-
通过主机名获取:可以使用
getByName(String host)方法,该方法会返回一个表示指定主机名的InetAddress对象。
java
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressExample {public static void main(String[] args) {try {InetAddress address = InetAddress.getByName("www.example.com");System.out.println(address);} catch (UnknownHostException e) {System.out.println("无法解析主机名: " + e.getMessage());}}
}
-
获取本地主机地址:使用
getLocalHost()方法,它会返回一个表示本地主机的InetAddress对象。
java
import java.net.InetAddress;
import java.net.UnknownHostException;public class LocalHostExample {public static void main(String[] args) {try {InetAddress localHost = InetAddress.getLocalHost();System.out.println("本地主机地址: " + localHost);} catch (UnknownHostException e) {System.out.println("无法获取本地主机地址: " + e.getMessage());}}
}
-
通过 IP 地址获取:使用
getByAddress(byte[] addr)方法,该方法会返回一个表示指定 IP 地址的InetAddress对象。
java
import java.net.InetAddress;
import java.net.UnknownHostException;
public class ByAddressExample {public static void main(String[] args) {try {byte[] ip = {127, 0, 0, 1};InetAddress address = InetAddress.getByAddress(ip);System.out.println(address);} catch (UnknownHostException e) {System.out.println("无法解析 IP 地址: " + e.getMessage());}}
}
3. 常用方法
-
getHostName():返回此 IP 地址的主机名。
java
import java.net.InetAddress;
import java.net.UnknownHostException;public class GetHostNameExample {public static void main(String[] args) {try {InetAddress address = InetAddress.getByName("www.example.com");String hostName = address.getHostName();System.out.println("主机名: " + hostName);} catch (UnknownHostException e) {System.out.println("无法解析主机名: " + e.getMessage());}}
}
-
getHostAddress():返回此 IP 地址的字符串表示形式。
java
import java.net.InetAddress;
import java.net.UnknownHostException;public class GetHostAddressExample {public static void main(String[] args) {try {InetAddress address = InetAddress.getByName("www.example.com");String hostAddress = address.getHostAddress();System.out.println("IP 地址: " + hostAddress);} catch (UnknownHostException e) {System.out.println("无法解析主机名: " + e.getMessage());}}
}
-
isReachable(int timeout):测试是否可以达到该地址。该方法会尝试与该地址建立连接,如果在指定的超时时间内成功建立连接,则返回true,否则返回false。
java
import java.net.InetAddress;
import java.io.IOException;
public class IsReachableExample {public static void main(String[] args) {try {InetAddress address = InetAddress.getByName("www.example.com");boolean isReachable = address.isReachable(5000);System.out.println("是否可以到达: " + isReachable);} catch (IOException e) {System.out.println("发生 I/O 错误: " + e.getMessage());}}
}
4. 子类
Inet4Address 和 Inet6Address 是 InetAddress 的具体子类,分别代表 IPv4 和 IPv6 地址。你可以使用 instanceof 运算符来判断一个 InetAddress 对象是 IPv4 还是 IPv6 地址。
java
import java.net.InetAddress;
import java.net.UnknownHostException;public class SubclassExample {public static void main(String[] args) {try {InetAddress address = InetAddress.getByName("www.example.com");if (address instanceof java.net.Inet4Address) {System.out.println("这是一个 IPv4 地址");} else if (address instanceof java.net.Inet6Address) {System.out.println("这是一个 IPv6 地址");}} catch (UnknownHostException e) {System.out.println("无法解析主机名: " + e.getMessage());}}
}
综上所述,InetAddress 类为 Java 程序与网络地址的交互提供了方便的方式,通过它可以轻松地进行主机名解析、IP 地址获取以及网络可达性测试等操作。
端口号
-
是应用程序在设备中唯一的标识
-
端口号:
-
由两个字节表示的整数,取值范围是0~65535
-
其0~1023之间的端口用于一些知名的网络网络服务或者应用
-
我们自己使用1024以上的端口号就可以了
-
-
注意:一个端口号只能被一个应用程序使用
网络编程中的协议知识点整理
一、网络协议概述
网络协议是计算机网络中进行数据交换而建立的规则、标准或约定的集合。它规定了数据传输的格式、传输顺序、错误处理等方面的内容,确保不同设备之间能够准确、可靠地进行通信。
二、常见网络协议层次模型
1. OSI 七层模型
-
物理层:负责传输比特流,规定了传输介质、接口类型、信号编码等物理特性。例如,以太网的网线接口、光纤的传输标准等。
-
数据链路层:将物理层接收到的比特流封装成帧,进行差错检测和流量控制。常见协议有以太网协议(Ethernet),用于局域网中设备之间的通信。
-
网络层:负责将帧从源节点传输到目标节点,进行路由选择和寻址。主要协议有 IP(Internet Protocol)协议,包括 IPv4 和 IPv6。
-
传输层:提供端到端的可靠通信,确保数据的正确传输。常见协议有 TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)。
-
会话层:负责建立、管理和终止会话,协调不同应用程序之间的通信。例如,RPC(Remote Procedure Call)协议。
-
表示层:处理数据的表示和转换,如加密、解密、压缩、解压缩等。例如,SSL/TLS 协议用于数据加密传输。
-
应用层:为用户提供应用程序接口,直接面向用户的应用程序。常见协议有 HTTP(Hypertext Transfer Protocol)、FTP(File Transfer Protocol)、SMTP(Simple Mail Transfer Protocol)等。
2. TCP/IP 四层模型
-
网络接口层:对应 OSI 模型的物理层和数据链路层,负责将数据帧在物理网络上传输。
-
网际层:与 OSI 模型的网络层功能相似,主要协议是 IP 协议。
-
传输层:和 OSI 模型的传输层相同,提供 TCP 和 UDP 协议。
-
应用层:包含了 OSI 模型的会话层、表示层和应用层的功能,常见协议有 HTTP、FTP、SMTP 等。
三、常见网络协议详解
1. IP 协议
-
功能:为网络中的设备分配唯一的 IP 地址,实现数据包的路由和转发。
-
版本
:
-
IPv4:采用 32 位地址,地址数量有限,格式为点分十进制,如
192.168.1.1。 -
IPv6:采用 128 位地址,解决了 IPv4 地址不足的问题,格式为冒分十六进制,如
2001:0db8:85a3:0000:0000:8a2e:0370:7334。
-
2. TCP 协议
-
特点:面向连接、可靠传输、基于字节流。在传输数据之前,需要先建立连接(三次握手),传输完成后需要断开连接(四次挥手)。
-
三次握手
:
-
客户端向服务器发送 SYN 包,请求建立连接。
-
服务器收到 SYN 包后,向客户端发送 SYN + ACK 包,表示同意建立连接。
-
客户端收到 SYN + ACK 包后,向服务器发送 ACK 包,连接建立成功。
-
-
四次挥手(:确保连接断开,且数据处理完毕)
:
-
客户端向服务器发送 FIN 包,表示请求关闭连接。
-
服务器收到 FIN 包后,向客户端发送 ACK 包,表示同意关闭连接。
-
服务器向客户端发送 FIN 包,表示请求关闭连接。
-
客户端收到 FIN 包后,向服务器发送 ACK 包,表示同意关闭连接。
-
3. UDP 协议
-
特点:无连接、不可靠传输、基于数据报。不需要建立连接,直接发送数据,传输效率高,但不能保证数据的可靠到达。适用于对实时性要求较高、对数据准确性要求较低的场景,如视频直播、在线游戏等。
-
三种通信方式
-
单播
-
下面聊天室的代码就是单播
-
-
组播
-
组播地址:224.0.0.0~239.255.255.255
-
其中224.0.0.0~224.0.0255 位预留的组播地址
-
-
-
广播
-
广播地址255.255.255.255
-
-
-
以下是用 Java 语言实现该聊天室功能的代码示例及解析:
发送端代码(Sender.java)
java
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.*; public class Sender {public static void main(String[] args) throws IOException {// 创建DatagramSocket对象用于发送数据报DatagramSocket ds = new DatagramSocket(); // 创建BufferedReader用于从键盘读取输入BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String line;while (true) {line = br.readLine();// 判断是否输入886,如果是则结束发送if ("886".equals(line)) {break;}// 将输入的字符串转换为字节数组byte[] bys = line.getBytes();// 创建DatagramPacket对象,指定发送的数据、长度、目标地址和端口DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("localhost"), 12345);// 发送数据报ds.send(dp);}// 关闭资源ds.close();} }接收端代码(Receiver.java)
java
import java.io.IOException; import java.net.*; public class Receiver {public static void main(String[] args) throws IOException {// 创建DatagramSocket对象,指定接收数据的端口DatagramSocket ds = new DatagramSocket(12345);while (true) {// 创建字节数组用于存储接收的数据byte[] bys = new byte[1024];// 创建DatagramPacket对象用于接收数据报DatagramPacket dp = new DatagramPacket(bys, bys.length);// 接收数据报ds.receive(dp);// 获取接收到的数据的实际长度int length = dp.getLength();// 将字节数组转换为字符串并输出String data = new String(bys, 0, length);System.out.println("收到消息: " + data);}} }代码解析
-
发送端(Sender.java)
-
首先创建
DatagramSocket对象,这是 UDP 通信中用于发送和接收数据报的套接字。 -
通过
BufferedReader从键盘读取用户输入。 -
使用
while循环持续读取输入,当输入为886时跳出循环。 -
对于每次读取到的非
886输入,将其转换为字节数组,创建DatagramPacket对象,指定目标地址(这里用localhost表示本地主机)和端口(12345),然后通过send方法发送数据报。 -
最后关闭
DatagramSocket资源。
-
-
接收端(Receiver.java)
-
创建
DatagramSocket对象并指定端口(12345),用于接收发送端发来的数据报。 -
使用一个无限循环(死循环)持续接收数据报。在循环内,先创建字节数组和
DatagramPacket对象。 -
通过
receive方法接收数据报,然后获取数据的实际长度,将字节数组转换为字符串并输出接收到的消息。
-
注意事项:
-
这里发送端和接收端的端口要对应一致(都是
12345),实际应用中可根据需求修改。 -
代码中发送的目标地址为
localhost,意味着发送和接收都在本地进行,若要在网络中不同主机间通信,需改为对应主机的 IP 地址。
-
4. HTTP 协议
-
功能:用于在 Web 浏览器和 Web 服务器之间传输超文本(如 HTML 页面)。
-
版本
:
-
HTTP/1.0:无状态协议,每次请求都需要建立新的连接,效率较低。
-
HTTP/1.1:支持持久连接、请求头压缩、分块传输等功能,提高了传输效率。
-
HTTP/2:采用二进制分帧、多路复用、头部压缩等技术,进一步提高了性能。
-
-
请求方法:常见的有 GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)等。
5. FTP 协议
-
功能:用于在客户端和服务器之间进行文件传输。
-
工作模式
:
-
主动模式:服务器主动连接客户端的数据端口。
-
被动模式:服务器等待客户端连接其数据端口。
-
6. SMTP、POP3 和 IMAP 协议
-
SMTP(Simple Mail Transfer Protocol):用于发送电子邮件。
-
POP3(Post Office Protocol 3):用于接收电子邮件,将邮件从服务器下载到本地客户端后,服务器上的邮件通常会被删除。
-
IMAP(Internet Message Access Protocol):也是用于接收电子邮件,但可以在服务器上保留邮件副本,方便在不同设备上同步邮件。
四、协议的选择和应用场景
-
TCP 协议:适用于对数据准确性要求较高、对实时性要求较低的场景,如文件传输、网页浏览等。
-
UDP 协议:适用于对实时性要求较高、对数据准确性要求较低的场景,如视频直播、在线游戏等。
-
HTTP 协议:主要用于 Web 应用开发,实现客户端和服务器之间的通信。
-
FTP 协议:用于文件的上传和下载。
-
SMTP、POP3 和 IMAP 协议:用于电子邮件的发送和接收。
相关文章:
Day(21)--网络编程
网络编程 在网络通信协议下,不同计算机上运行的程序,进行的数据传输 应用场景:即使通信、网友对战、金融证券等等,不管是什么场景,都是计算机和计算机之间通过网络进行的数据传输 java.net 常见的软件架构 C/S&am…...
JVM 调优不再难:AI 工具自动生成内存优化方案
在 Java 应用程序的开发与运行过程中,Java 虚拟机(JVM)的性能调优一直是一项极具挑战性的任务,尤其是内存优化方面。不合适的 JVM 内存配置可能会导致应用程序出现性能瓶颈,甚至频繁抛出内存溢出异常,影响业…...
封装Tcp Socket
封装Tcp Socket 0. 前言1. Socket.hpp2. 简单的使用介绍 0. 前言 本文中用到的Log.hpp在笔者的历史文章中都有涉及,这里就不再粘贴源码了,学习地址如下:https://blog.csdn.net/weixin_73870552/article/details/145434855?spm1001.2014.3001…...
5.1 GitHub订阅监控系统实战:FastAPI+SQLAlchemy高效架构设计与核心源码揭秘
GitHub Sentinel Agent 分析报告功能设计与实现 关键词:订阅管理 API 设计、GitHub API 集成、SQLAlchemy ORM、JWT 认证、单元测试框架 1. 订阅管理功能架构设计 订阅管理模块采用分层架构设计,通过 FastAPI 构建 RESTful 接口,结合 SQLAlchemy ORM 实现数据持久化: #me…...
2025年推荐使用的开源大语言模型top20:核心特性、选择指标和开源优势
李升伟 编译 随着人工智能技术的持续发展,开源大型语言模型(LLMs)正变得愈发强大,使最先进的AI能力得以普及。到2025年,开源生态系统中涌现出多个关键模型,它们在各类应用场景中展现出独特优势。 大型语言…...
Linux 入门九:Linux 进程间通信
概述 进程间通信(IPC,Inter-Process Communication)是指在不同进程之间传递数据和信息的机制。Linux 提供了多种 IPC 方式,包括管道、信号、信号量、消息队列、共享内存和套接字等。 方式 一、管道(Pipe)…...
Spark-SQL核心编程实战:自定义函数与聚合函数详解
在大数据处理领域,Spark-SQL是极为重要的工具。今天和大家分享一下在Spark-SQL开发中的自定义函数和聚合函数的使用,这些都是基于实际项目开发经验的总结。 在Spark-SQL开发时,第一步是搭建开发环境。在IDEA中创建Spark-SQL子模块,…...
[Mysql][Mybatis][Spring]配置文件未能正确给驱动赋值,.properties文件username值被替换
这是最初的.properties配置文件: drivercom.mysql.cj.jdbc.Driver urljdbc:mysql://localhost:3306/qykf usernameroot password123456 在Mybatis中引入后进行赋值: <environments default"development"><environment id"deve…...
go 指针接收者和值接收者的区别
go 指针接收者和值接收者的区别 指针接收者和值接收者的区别主要有两点: Go 中函数传参是传值,因此指针接收者传递的是接收者的指针拷贝,值接收者传递的是接收者的拷贝---在方法中指针接收者的变量会被修改,而值接收者的成员变量…...
Redis之缓存更新策略
缓存更新策略 文章目录 缓存更新策略一、策略对比二、常见的缓存更新策略三、如何选择策略四、实际应用示例五、使用 Cache-Aside TTL 的方式,实现缓存商铺信息详情1.引入StringRedisTemplate2.将查询商铺信息加入缓存3.更新商铺信息时移除缓存总结 六、注意事项 一…...
【leetcode100】杨辉三角
1、题目描述 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]…...
git reset详解
一、git reset 的核心作用 用于 移动当前分支的 HEAD 指针 到指定的提交,并可选择是否修改工作区和暂存区。 ⚠️ 注意:若提交已被推送到远程仓库,强制重置(--hard)后需谨慎操作,避免影响协作。 二、三种模…...
Selenium2+Python自动化:利用JS解决click失效问题
文章目录 前言一、遇到的问题二、点击父元素问题分析解决办法实现思路 三、使用JS直接点击四、参考代码 前言 在使用Selenium2和Python进行自动化测试时,我们有时会遇到这样的情况:元素明明已经被成功定位,代码运行也没有报错,但…...
OpenStack Yoga版安装笔记(十九)启动一个实例(Self-service networks)
1、概述 1.1 官方文档 Launch an instancehttps://docs.openstack.org/install-guide/launch-instance.html 《OpenStack Yoga版安装笔记(十四)启动一个实例》文档中,已经按照Option1: Provider networks创建网络。 本文按照Option2&#…...
数据结构(java)栈与队列
栈:(先进后出) 入栈: 1.普通栈一定要放、最小栈放的原则是: *如果最小栈是空的,那么放 *如果最小栈的栈顶元素没有当前的元素小,则放 2.如果要放的的元素小于等于最小栈栈顶元素可以放吗?放 出栈: 需要…...
Flask+Plotly结合动态加载图形页面实践
1. DeepSeek帮我实践 1.1. 我的提问既设计方案 原有如下主页:dashboard.html,现增加“预测模型学习”,对感知机神经网络描述如下: 1、输入与输出为固定值,例如输入层215,输出层48; 2、模型为回归神经网络; 3、中层是可动态调整的,例如定义如下:第二层,200,第三层…...
数学教学通讯杂志数学教学通讯杂志社数学教学通讯编辑部2025年第6期目录
课程教材教法 “课程思政”视域下的高中数学教学探索与实践——以“函数概念的发展历程”为例 赵文博; 3-617 PBL教学模式下高中统计教学的探索与实践——以“随机抽样(第一课时)”为例 陈沛余; 7-10 “三新”背景下的高中数学教学困境与应对…...
整活 kotlin + springboot3 + sqlite 配置一个 SQLiteCache
要实现一个 SQLiteCache 也是很简单的只需要创建一个 cacheManager Bean 即可 // 如果配置文件中 spring.cache.sqlite.enable false 则不启用 Bean("cacheManager") ConditionalOnProperty(name ["spring.cache.sqlite.enable"], havingValue "t…...
C#容器源码分析 --- Dictionary<TKey,TValue>
Dictionary<TKey, TValue> 是 System.Collections.Generic 命名空间下的高性能键值对集合,其核心实现基于哈希表和链地址法(Separate Chaining)。 .Net4.8 Dictionary<TKey,TValue>源码地址: dictionary…...
在 Visual Studio Code 中安装通义灵码 - 智能编码助手
高效的编码工具对于提升开发效率和代码质量至关重要。 通义灵码作为一款智能编码助手,为开发者提供了全方位的支持。 本文将详细介绍如何在 Visual Studio Code(简称 VSCode)中安装通义灵码,以及如何进行相关配置以开启智能编码…...
【AutoTest】自动化测试工具大全(Java)
😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 &#x…...
idea报错java: 非法字符: ‘\ufeff‘解决方案
解决方案步骤以及说明 BOM是什么?1. BOM的作用2. 为什么会出现 \ufeff 错误?3. 如何解决 \ufeff 问题? 最后重新编译,即可运行!!! BOM是什么? \ufeff 是 Unicode 中的 BOM࿰…...
PHY芯片与网络变压器接线设计指南——不同速率与接口的硬件设计原则
一、PHY与网络变压器的核心作用 • PHY芯片(物理层芯片) • 功能:实现数据编码(如Manchester、PAM4)、时钟恢复、链路协商(Auto-Negotiation)。 • 接口类型:MII/RMII/GMII/RGMII/…...
【学习笔记】计算机网络(八)—— 音频/视频服务
第8章 互联网上的音频/视频服务 文章目录 第8章 互联网上的音频/视频服务8.1概述8.2 流式存储音频/视频8.2.1 具有元文件的万维网服务器8.2.2 媒体服务器8.2.3 实时流式协议 RTSP 8.3 交互式音频/视频8.3.1 IP 电话概述8.3.2 IP电话所需要的几种应用协议8.3.3 实时运输协议 RTP…...
linux: 文件描述符fd
目录 1.C语言文件操作复习 2.底层的系统调用接口 3.文件描述符的分配规则 4.重定向 1.C语言文件操作复习 文件 内容 属性。所有对文件的操作有两部分:a.对内容的操作;b.对属性的操作。内容是数据,属性其实也是数据-存储文件,…...
记录一次后台项目的打包优化
文章目录 前言分析问题寻找切入点根据切入点逐一尝试cdn引入node包遇到的一些问题记录最终结果 前言 优化,所有开发者到一定的程度上,都绕不开的问题之一 例如: 首页加载优化白屏优化列表无限加载滚动优化,图片加载优化逻辑耦合…...
问题记录(四)——拦截器“失效”?null 还是“null“?
拦截器“失效”?null 还是"null"? 问题描述 这个问题本身并不复杂,但是却是一个容易被忽略的问题。 相信大家在项目中一定实现过强制登录的逻辑吧,巧了,所要介绍的问题就出现在测试强制登录接口的过程中&am…...
前端面试-HTML5与CSS3
HTML5/CSS3 1. HTML5语义化标签的作用是什么?请举例说明5个常用语义化标签及其适用场景 解答: 语义化标签通过标签名称直观表达内容结构,有利于: 提升可访问性(屏幕阅读器识别)改善SEO(搜索引…...
blender 导出衣服mesh为fbx,随后导入UE5,坐标轴如何保存一致
When exporting a clothing mesh from Blender to UE5 as an FBX file, maintaining consistent coordinate axes is crucial for proper positioning and orientation. Heres how to ensure coordinate consistency throughout the workflow: 当从 Blender 导出衣服 mesh 为 U…...
前端开发中的问题排查与定位:HTML、CSS、JavaScript(报错的解决方式)
目录 1.html 1. 结构错误调试:标签未正确嵌套 2. 语法问题调试:缺失引号 3. 断点调试:动态生成内容时的 JavaScript 错误 4. 网络调试:资源加载错误 5. 性能调试:页面加载性能 总结: 2.CSS 1. 定位…...
