通信网络编程——JAVA
1.计算机网络
IP
-
定义与作用 :IP 地址是在网络中用于标识设备的数字标签,它允许网络中的设备之间相互定位和通信。每一个设备在特定网络环境下都有一个唯一的 IP 地址,以此来确定其在网络中的位置。
-
分类 :常见的 IP 地址分为 IPv4 和 IPv6。
-
IPv4 地址是一个 32 位的二进制数,通常被分为 4 个字节,表示为十进制形式,如 192.168.1.1。
-
由于 IPv4 地址数量有限,逐渐出现了 IPv6 地址, 它是128 位的二进制数,通常表示为 8 组 16 进制数,如 2001:0db8:85a3:0000:0000:8a2e:0370:7334。
端口
-
定义与作用 :端口是操作系统中的一个抽象概念,用于区分同一设备上运行的不同程序。在 TCP/IP 协议族中,端口号是一个 16 位的数字,范围从 0 到 65535。当数据到达设备后,系统会根据端口号将数据转发给对应的程序进行处理。
-
分类 :端口可以分为三大类。
-
一类是熟知端口(0 - 1023),这些端口通常被系统服务所使用,如 HTTP 协议使用 80 端口,HTTPS 协议使用 443 端口等。
-
另一类是注册端口(1024 - 49151),这些端口可以被用户进程或应用程序使用,但需要在相关机构进行注册。
-
还有一类是动态和 / 或私有端口(49152 - 65535),这些端口可以自由使用,通常用于临时会话或应用程序内部通信。
TCP/UDP 传输协议
-
TCP 协议
-
特点 :TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它在正式通信之前需要建立连接,如同打电话之前先拨号建立通话线路一样。在数据传输过程中,TCP 通过三次握手建立连接,确保双方都准备好数据进行传输。并且它采用流量控制、拥塞控制等机制,能够有效避免网络拥塞和数据丢失。
-
应用场景 :适用于对数据准确性要求高、数据传输量较大的场景,如文件传输、邮件传输、网页浏览等。
-
-
UDP 协议
-
特点 :UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议。它不建立连接就直接发送数据,数据传输就像是直接投递一封信,不考虑对方是否准备好接收。UDP 不保证的数据可靠传输,数据可能会丢失、重复或乱序到达。不过,UDP 的传输速度相对较快,因为它不需要进行繁琐的连接建立和维护过程。
-
应用场景 :适用于对实时性要求高、对数据丢失不太敏感的场景,如视频直播、在线游戏、实时语音通信等。
-
服务器与客户端
-
服务器
-
定义与作用 :服务器是网络环境中的高性能计算机或设备,它运行特定的服务器软件,为客户端提供各种服务和资源。
-
工作原理 :服务器通常会一直保持监听状态,等待客户端的连接请求。当收到请求后,服务器会根据请求的内容和协议进行相应的处理,并将处理结果返回给客户端。为了确保能够同时处理多个客户端的请求,服务器通常会采用多线程、多进程或异步 IO 等技术。
-
-
客户端
-
定义与作用 :客户端是用户直接使用并与服务器进行交互的设备或软件。它向服务器发送请求,并接收服务器返回的响应。
-
工作原理 :客户端一般需要知道服务器的 IP 地址和端口号,通过建立与服务器的连接,按照特定的协议格式发送请求消息。在接收到服务器的响应后,客户端会对响应进行解析和处理,以实现用户期望的功能。
-
IO 模型
-
同步 IO 模型
-
阻塞 IO :阻在塞 IO 模型下,客户端调用 IO 操作后会一直阻塞,直到操作完成并返回结果。例如,在文件读取操作中,如果采用阻塞 IO,那么在读取文件内容的过程中,程序会暂停执行,等待文件读取完成才能继续向下执行。这种方式的缺点是资源利用率较低,因为线程或进程在等待 IO 完成期间无法进行其他工作。
-
非阻塞 IO :非阻塞 IO 模型与阻塞 IO 不同,它在调用 IO 操作时会立即返回,不会一直等待操作完成。但需要客户端不断轮询 IO 操作的状态,直到操作完成。例如,客户端发送一个非阻塞的网络请求后,会不断地询问操作系统这个请求是否完成,这种方式会增加 CPU 的负担,因为需要不断地进行轮询操作。
-
-
异步 IO 模型
-
特点 :异步 IO 模型是基于事件通知机制的。客户端发起 IO 操作后,会立即返回,操作系统会在 IO 操作完成时主动通知客户端。这样客户端可以在等待 IO 完成期间继续执行其他任务,提高了资源的利用率。例如,在网页浏览器中,当用户点击一个按钮触发一个异步请求时,浏览器可以继续响应用户的其他操作,如滚动页面等,而不会被这个请求所阻塞。
-
优势 :可以提高程序的并发能力和响应速度,特别适用于高并发的场景,如 Web 服务器处理大量客户端请求时,采用异步 IO 能够更有效地利用系统资源,提高服务器的性能。
-
通信架构模式
-
C/S 架构(Client/Server 架构)
-
特点 :C/S 架构是一种基于请求 - 响应模式的架构。客户端负责与用户交互,将用户请求发送给服务器;服务器负责处理客户端请求,并将处理结果返回给客户端。这种架构需要在客户端安装专门的客户端软件,如银行的客户端应用程序、企业的内部办公软件等。
-
优点 :客户端软件可以提供丰富的用户界面和交互功能,能够对硬件资源进行充分利用,同时可以更好地控制数据的安全性和完整性。
-
缺点 :客户端软件的安装和维护成本较高,当需要进行软件升级时,需要对所有客户端进行更新。并且客户端对服务器的依赖性较强,服务器的性能和稳定性直接影响到整个系统的运行。
-
-
B/S 架构(Browser/Server 架构)
-
特点 :B/S 架构是基于浏览器和服务器的架构。客户端只需要安装浏览器,通过浏览器访问服务器上的 Web 应用程序。服务器负责处理所有请求和业务逻辑,并返回相应的网页给客户端进行展示。例如,各种在线购物网站、社交媒体平台等都是基于 B/S 架构的。
-
优点 :客户端无需安装专门的软件,只要能够访问网络并打开浏览器即可使用。软件的升级和维护只需要在服务器端进行,降低了维护成本和复杂度。并且具有很好的兼容性和跨平台性,可以在不同的操作系统和设备上使用。
-
缺点 :相比 C/S 架构,B/S 架构下的网页应用在用户交互和界面体验方面可能会受到浏览器的限制。同时,服务器端的负载相对较大,需要处理大量的请求和业务逻辑。
-
2.核心API
Socket
-
定义与作用 :Socket(套接字)是网络通信中的一种抽象概念,它是网络通信过程中的一个端点,用于实现不同设备之间的双向通信。通过 Socket,应用程序可以在网络中进行数据的发送和接收,就好像在设备之间建立了一条虚拟的通信管道。
-
使用流程 :对于 TCP Socket,客户端先创建 Socket,然后连接到服务器的特定端口和 IP 地址;服务器端创建 Socket,绑定到本地的某个端口和 IP 地址,开始监听连接请求,接收客户端连接后,双方就可以通过 Socket 进行数据的读写操作。对于 UDP Socket,不需要建立连接,客户端和服务器端都可以直接发送和接收数据报。
ServerSocket
-
定义与作用 :ServerSocket 是服务器端用于监听和接受客户端连接请求的套接字。它在服务器端等待客户端的连接,当客户端请求连接时,ServerSocket 会接受请求并创建一个新的 Socket 来与客户端进行通信,从而实现服务器与多个客户端的同时通信。
-
工作原理 :ServerSocket 绑定到本地的某个端口,然后开始监听该端口的连接请求。当客户端发送连接请求时,ServerSocket 会接受这个请求,并返回一个与客户端通信的 Socket 对象。服务器端可以通过这个 Socket 对象与客户端进行数据的读写操作,而 ServerSocket 则继续监听该端口,等待其他客户端的连接请求。
DNS 域名解析服务器
-
定义与作用 :DNS(Domain Name System)域名解析服务器是用于将域名转换为 IP 地址的服务器。在互联网中,用户通常使用域名来访问网站,而计算机之间通信需要使用 IP 地址。DNS 服务器的作用就是将用户输入的域名解析为对应的 IP 地址,使得用户可以通过域名方便地访问网站。
-
工作原理 :当用户在浏览器中输入一个域名时,浏览器会首先向本地 DNS 服务器发送域名解析请求。本地 DNS 服务器会先在自己的缓存中查找该域名对应的 IP 地址,如果找到则直接返回给浏览器;如果没有找到,本地 DNS 服务器会向根 DNS 服务器发送请求,根 DNS 服务器会根据域名的顶级域名(如.com、.net 等)返回相应的顶级域名服务器的地址,本地 DNS 服务器再向顶级域名服务器发送请求,顶级域名服务器会根据域名的二级域名返回相应的权威 DNS 服务器的地址,本地 DNS 服务器最后向权威 DNS 服务器发送请求,权威 DNS 服务器会返回该域名对应的 IP 地址,本地 DNS 服务器将这个 IP 地址缓存起来并返回给浏览器,浏览器就可以使用这个 IP 地址来访问网站了。
InputStream
-
定义与作用 :InputStream 是 Java 中的一个输入流类,它用于从源读取字节数据。源可以是文件、网络连接、内存缓冲区等。InputStream 是所有字节输入流的父类,它提供了一组基本的方法用于读取数据,如 read() 方法用于读取单个字节,read(byte[] b) 方法用于将数据读入一个字节数组等。
-
常见子类与特点
-
FileInputStream :用于从文件中读取数据。它可以打开一个文件进行读取,读取到文件末尾时返回 - 1 表示结束。
-
BufferedInputStream :对其他输入流进行缓冲处理,提高读取效率。它通过内部维护一个缓冲区,减少对底层数据源的读取次数,从而提高读取速度。
-
ObjectInputStream :用于读取 Java 对象序列化的数据。它可以将序列化的对象从输入流中还原为 Java 对象,前提是该对象的类实现了 Serializable 接口。
-
OutputStream
-
定义与作用 :OutputStream 是 Java 中的一个输出流类,它用于将字节数据写入目标。目标可以是文件、网络连接、内存缓冲区等。OutputStream 是所有字节输出流的父类,它提供了一组基本的方法用于写入数据,如 write(int b) 方法用于写入单个字节,write(byte[] b) 方法用于将字节数组中的数据写入输出流等。
-
常见子类与特点
-
FileOutputStream :用于将数据写入文件。它可以创建一个新文件或追加数据到现有文件中。
-
BufferedOutputStream :对其他输出流进行缓冲处理,提高写入效率。它通过内部维护一个缓冲区,减少对底层数据目标的写入次数,从而提高写入速度。
-
ObjectOutputStream :用于将 Java 对象序列化后写入输出流。它可以将 Java 对象转换为字节流序列,便于存储或传输,前提是该对象的类实现了 Serializable 接口。
-
3.代码
服务器端代码(MyChatServer)
服务器启动
public class MyChatServer {public static void main(String[] args) {try {// 创建服务器套接字,监听端口12000ServerSocket serverSocket = new ServerSocket(12000);System.out.println("服务器启动,等待客户端连接......");
-
ServerSocket
:用于监听特定端口的传入连接请求。 -
serverSocket.accept()
:阻塞等待客户端连接,直到有客户端连接时返回一个Socket
对象。
处理客户端连接
// 接受客户端连接Socket socket = serverSocket.accept();System.out.println("客户端已连接:" + socket.getInetAddress() + ":" + socket.getPort());
-
socket.getInetAddress()
:获取客户端的IP地址。 -
socket.getPort()
:获取客户端的端口号。
获取输入输出流
// 获取输入输出流InputStream is = socket.getInputStream();OutputStream os = socket.getOutputStream();BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 从控制台读取消息BufferedReader serverIn = new BufferedReader(new InputStreamReader(is)); // 读取客户端消息
-
socket.getInputStream()
:获取输入流,用于读取客户端发送的数据。 -
socket.getOutputStream()
:获取输出流,用于向客户端发送数据。 -
BufferedReader
:用于从控制台或输入流读取文本数据。
通信循环
System.out.println("等待客户端消息......");while (true) {// 读取客户端发送的消息int messageLength = is.read(); // 读取消息长度byte[] messageBuffer = new byte[messageLength];for (int i = 0; i < messageBuffer.length; i++) {messageBuffer[i] = (byte) is.read();}String clientMessage = new String(messageBuffer);System.out.println("收到客户端消息:" + clientMessage);// 检查是否是退出命令if ("exit".equalsIgnoreCase(clientMessage)) {System.out.println("客户端已断开连接");break;}// 从控制台读取要发送给客户端的消息System.out.print("请输入要发送的消息:");String serverMessage = br.readLine();// 发送消息给客户端os.write(serverMessage.getBytes().length); // 发送消息长度os.write(serverMessage.getBytes()); // 发送消息内容os.flush();// 检查是否是退出命令if ("exit".equalsIgnoreCase(serverMessage)) {System.out.println("服务器将断开连接");break;}}
-
服务器首先读取消息的长度,然后根据长度读取消息内容。
-
消息以字节数组的形式传输,然后转换为字符串。
-
如果收到"exit"消息,服务器将退出通信循环。
-
服务器从控制台读取消息,并将其发送给客户端。
-
消息发送前,先发送消息长度,以便客户端知道要读取多少字节。
关闭资源
// 关闭资源br.close();os.close();is.close();socket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}
}
-
逐个关闭资源,确保没有资源泄漏。
完整代码
public class MyChatServer {public static void main(String[] args) {try {// 创建服务器套接字,监听端口12000ServerSocket serverSocket = new ServerSocket(12000);System.out.println("服务器启动,等待客户端连接......");// 接受客户端连接Socket socket = serverSocket.accept();System.out.println("客户端已连接:" + socket.getInetAddress() + ":" + socket.getPort());// 获取输入输出流InputStream is = socket.getInputStream();OutputStream os = socket.getOutputStream();BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 从控制台读取消息BufferedReader serverIn = new BufferedReader(new InputStreamReader(is)); // 读取客户端消息System.out.println("等待客户端消息......");while (true) {// 读取客户端发送的消息int messageLength = is.read();byte[] messageBuffer = new byte[messageLength];for (int i = 0; i < messageBuffer.length; i++) {messageBuffer[i] = (byte) is.read();}String clientMessage = new String(messageBuffer);System.out.println("收到客户端消息:" + clientMessage);// 检查是否是退出命令if ("exit".equalsIgnoreCase(clientMessage)) {System.out.println("客户端已断开连接");break;}// 从控制台读取要发送给客户端的消息System.out.print("请输入要发送的消息:");String serverMessage = br.readLine();// 发送消息给客户端os.write(serverMessage.getBytes().length);os.write(serverMessage.getBytes());os.flush();// 检查是否是退出命令if ("exit".equalsIgnoreCase(serverMessage)) {System.out.println("服务器将断开连接");break;}}// 关闭资源br.close();os.close();is.close();socket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}
}
客户端代码(ChatClient)
连接到服务器
public class ChatClient {public static void main(String[] args) {try {// 连接到服务器Socket socket = new Socket("127.0.0.1", 12000);System.out.println("客户端已连接到服务器");
-
Socket
:用于建立与服务器的连接。 -
"127.0.0.1"
:本地主机IP地址,表示客户端和服务器在同一台机器上。 -
12000
:服务器监听的端口号。
获取输入输出流
// 获取输入输出流InputStream is = socket.getInputStream();OutputStream os = socket.getOutputStream();BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 从控制台读取消息
-
客户端同样需要获取输入输出流,用于与服务器通信。
通信循环
System.out.println("等待服务器消息......");while (true) {// 从控制台读取要发送的消息System.out.print("请输入要发送的消息:");String clientMessage = br.readLine();// 发送消息给服务器os.write(clientMessage.getBytes().length); // 发送消息长度os.write(clientMessage.getBytes()); // 发送消息内容os.flush();// 检查是否是退出命令if ("exit".equalsIgnoreCase(clientMessage)) {System.out.println("客户端将断开连接");break;}// 读取服务器的响应消息int messageLength = is.read(); // 读取消息长度byte[] messageBuffer = new byte[messageLength];for (int i = 0; i < messageBuffer.length; i++) {messageBuffer[i] = (byte) is.read();}String serverMessage = new String(messageBuffer);System.out.println("收到服务器消息:" + serverMessage);// 检查是否是退出命令if ("exit".equalsIgnoreCase(serverMessage)) {System.out.println("服务器已断开连接");break;}}
-
客户端的通信逻辑与服务器类似,先发送消息,然后等待服务器的响应。
-
如果收到"exit"消息,客户端将退出通信循环。
关闭资源
// 关闭资源br.close();os.close();is.close();socket.close();} catch (IOException e) {e.printStackTrace();}}
}
完整代码
public class ChatClient {public static void main(String[] args) {try {// 连接到服务器Socket socket = new Socket("127.0.0.1", 12000);System.out.println("客户端已连接到服务器");// 获取输入输出流InputStream is = socket.getInputStream();OutputStream os = socket.getOutputStream();BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 从控制台读取消息System.out.println("等待服务器消息......");while (true) {// 从控制台读取要发送的消息System.out.print("请输入要发送的消息:");String clientMessage = br.readLine();// 发送消息给服务器os.write(clientMessage.getBytes().length);os.write(clientMessage.getBytes());os.flush();// 检查是否是退出命令if ("exit".equalsIgnoreCase(clientMessage)) {System.out.println("客户端将断开连接");break;}// 读取服务器的响应消息int messageLength = is.read();byte[] messageBuffer = new byte[messageLength];for (int i = 0; i < messageBuffer.length; i++) {messageBuffer[i] = (byte) is.read();}String serverMessage = new String(messageBuffer);System.out.println("收到服务器消息:" + serverMessage);// 检查是否是退出命令if ("exit".equalsIgnoreCase(serverMessage)) {System.out.println("服务器已断开连接");break;}}// 关闭资源br.close();os.close();is.close();socket.close();} catch (IOException e) {e.printStackTrace();}}
}
这个示例展示了一个基本的客户端-服务器Socket通信模型。服务器监听特定端口,客户端连接到该端口,双方可以通过输入输出流互相发送和接收消息。消息传输时,先发送消息长度,然后发送消息内容,这样可以确保接收方能够完整地读取消息。
效果展示
相关文章:
通信网络编程——JAVA
1.计算机网络 IP 定义与作用 :IP 地址是在网络中用于标识设备的数字标签,它允许网络中的设备之间相互定位和通信。每一个设备在特定网络环境下都有一个唯一的 IP 地址,以此来确定其在网络中的位置。 分类 :常见的 IP 地址分为 I…...
支持向量机算法
支持向量机(Support Vector Machine,SVM)作为机器学习领域中一颗耀眼的明星,凭借其卓越的分类与回归能力,在众多算法中独树一帜。它宛如一位精准的边界守护者,通过巧妙地构建超平面,将不同类别的…...
Redis集群模式、持久化、过期策略、淘汰策略、缓存穿透雪崩击穿问题
Redis四种模式 单节点模式 架构:单个Redis实例运行在单台服务器。 优点: 简单:部署和配置容易,适合开发和测试。 低延迟:无网络通信开销。 缺点: 单点故障&…...
【WPF】Opacity 属性的使用
在WPF(Windows Presentation Foundation)中,Opacity 属性是定义一个元素透明度的属性,其值范围是从 0.0(完全透明)到 1.0(完全不透明)。由于 Opacity 是在 UIElement 类中定义的&…...
编程题 02-线性结构3 Reversing Linked List【PAT】
文章目录 题目输入格式输出格式输入样例输出样例 题解解题思路完整代码 编程练习题目集目录 题目 Given a constant K K K and a singly linked list L L L, you are supposed to reverse the links of every K K K elements on L L L. For example, given L being 1 → …...
集成指南:如何采用融云 Flutter IMKit 实现双端丝滑社交体验
在移动应用开发领域,跨平台框架的广泛应用已成为一种趋势。 融云跨平台方案持续升级,近期正式上线 Flutter IMKit,uni-app IMKit 也将紧随其后向广大开发者开放。覆盖两大跨平台核心框架,一套代码即可支持 Android、iOS 双端丝滑…...
使用vite重构vue-cli的vue3项目
一、修改依赖 首先修改 package.json,修改启动方式与相应依赖 移除vue-cli并下载vite相关依赖,注意一些peerDependency如fast-glob需要手动下载 # 移除 vue-cli 相关依赖 npm remove vue/cli-plugin-babel vue/cli-plugin-eslint vue/cli-plugin-rout…...
LeetCode 2094.找出 3 位偶数:遍历3位偶数
【LetMeFly】2094.找出 3 位偶数:遍历3位偶数 力扣题目链接:https://leetcode.cn/problems/finding-3-digit-even-numbers/ 给你一个整数数组 digits ,其中每个元素是一个数字(0 - 9)。数组中可能存在重复元素。 你…...
FLASH闪存(擦除、编译)
FLASH闪存 文章目录 FLASH闪存1.存储器映像位置2.FLASH简介3.闪存模块组织3.2闪存的共性: 4.FLASH基本结构4.1FLASH解锁4.2使用指针访问寄存器 5.选项字节5.1选项字节编程5.2选项字节擦除 6.相关函数介绍7.读取内部FLASH(实操)7.1接线图7.2工…...
企业即时通讯软件,私有化安全防泄密
在数字化转型与信创战略双重驱动下,企业对即时通讯工具的需求已从基础沟通转向安全可控、高效协同的综合能力。BeeWorks作为一款专为政企设计的私有化即时通讯与协同办公平台,凭借其全链路安全架构、深度国产化适配及灵活的业务集成能力,成为…...
直方图特征结合 ** 支持向量机图片分类
一、核心技术框架 1. 直方图特征原理 颜色直方图:统计图像中每个颜色区间(如 RGB 通道)的像素数量,反映颜色分布。HOG 直方图(方向梯度直方图):统计图像局部区域的梯度方向分布,捕…...
【prometheus+Grafana篇】基于Prometheus+Grafana实现windows操作系统的监控与可视化
💫《博主主页》: 🔎 CSDN主页 🔎 IF Club社区主页 🔥《擅长领域》:擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(MongoDB)有了…...
PyTorch实战(4)——卷积神经网络(Convolutional Neural Network, CNN)详解
PyTorch实战(4)——卷积神经网络详解 0. 前言1. 全连接网络的缺陷2. 卷积神经网络基本组件2.1 卷积2.2 步幅和填充2.3 池化2.3 卷积神经网络完整流程 3. 卷积和池化相比全连接网络的优势4. 使用 PyTorch 构建卷积神经网络4.1 使用 PyTorch 构建 CNN 架构…...
【Python】Python常用控制结构详解:条件判断、遍历与循环控制
Python提供了多种控制结构来处理逻辑判断和循环操作,包括if-else条件分支、switch替代方案、遍历方法以及循环控制语句break和continue。以下是对这些功能的详细说明及示例: 一、条件判断:if-else与多分支结构 单分支结构 • 语法࿱…...
在Linux中安装JDK并且搭建Java环境
1.首先准备好JDK的Linux的安装包 2.打开Linux,进入root的文件夹,直接拖入即可 3.输入解压命令,后面指定的是位置(注意不要填写错误,就填写这个) 4.之后进入我们安装的jdk的文件 利用pwd命令,展示我们安装的目录,之后…...
理解多智能体深度确定性策略梯度MADDPG算法:基于python从零实现
引言:多智能体强化学习(MARL) 多智能体强化学习(MARL)将强化学习拓展到多个智能体在共享环境中相互交互的场景。这些智能体可能相互合作、竞争,或者目标混杂。MARL 引入了单智能体设置中不存在的独特挑战。…...
【AI大语言模型本质分析框架】
AI大语言模型本质分析框架 ——从教育危机到智能本质的七层递进式解构 第一层:现象观察——阴(显性危机)与阳(隐性变革)的共存 观点1(阴):AI作弊泛滥,传统教育体系崩溃…...
算法模型部署后_python脚本API测试指南-记录3
API 测试指南 服务运行后,可以通过以下方式测试: Curl: curl -X POST -F "file./test_dataset/surface/surface57.png" http://<服务器IP>:9000/api/v1/predictPython 脚本: (参考 svm_request测试.py) import requestsurl http://…...
鸿蒙(HarmonyOS)应用开发入门教程
目录 第一章:鸿蒙系统简介 1.1 什么是鸿蒙系统? 1.2 鸿蒙系统架构 第二章:开发环境搭建 2.1 安装DevEco Studio 步骤1:下载与安装 步骤2:首次配置 步骤3:设备准备 2.2 创建第一个项目 第三章:鸿蒙应用开发基础 3.1 核心概念:Ability与AbilitySlice 示例代码…...
MIT XV6 - 1.6 Lab: Xv6 and Unix utilities -uptime
接上文 MIT XV6 - 1.5 Lab: Xv6 and Unix utilities - xargs 第一章持续有点久了,虽然肯定有些特点和细节还没注意到,但这次的主要目的是学习内核部分,决定水一篇然后进入第二章节 uptime 第一章的最后一个实验,选做性质…...
Python语言在地球科学交叉领域中的应用——从数据可视化到常见数据分析方法的使用【实例操作】
前言: Python是功能强大、免费、开源,实现面向对象的编程语言,Python能够运行在Linux、Windows、Macintosh、AIX操作系统上及不同平台(x86和arm),Python简洁的语法和对动态输入的支持,再加上解释…...
flutter 的 json序列化和反序列化
一、json转实体 Instantly parse JSON in any language | quicktype 二、实体中的toJson和fromJson 实现 官方推荐的 两个插件(个人觉得一个实体会多一个.g.dart 文件太多了,不喜欢) json_annotation json_serializable 三、使用 dart_json_mapper 实现上面的功…...
什么是数据集市(Data Mart)?
数据集市(Data Mart)是数据仓库(Data Warehouse)的一个子集,专门针对某个特定业务部门、业务线或主题领域,存储和管理该部门或领域所需的特定数据。它通常包含从企业范围的数据仓库中抽取、筛选和汇总的部分…...
从攻击者角度来看Go1.24的路径遍历攻击防御
目录 一、具体攻击示例 程序 攻击步骤: 二、为什么攻击者能成功? 分析 类比理解 总结 三、TOCTOU 竞态条件漏洞 1、背景:符号链接遍历攻击 2. TOCTOU 竞态条件漏洞 3. 另一种变体:目录移动攻击 4. 问题的核心 四、防…...
[ARM][汇编] 01.基础概念
目录 1.全局标号 1.1.使用方法 1.1.1.声明全局标号 1.1.2.定义全局标号 1.1.3.引用全局标号 1.2.全局标号与局部标号的区别 1.3.注意事项 2.局部标号 2.1.使用方法 2.1.1.定义局部标号 2.1.2.跳转引用 2.2.局部标号与全局标号的对比 2.3.注意事项 3.符号定义伪指…...
杭州电商全平台代运营领军者——品融电商
杭州电商全平台代运营领军者——品融电商:以“效品合一”驱动品牌全域增长 在电商行业竞争日益白热化的当下,品牌如何突破流量焦虑、实现长效增长?作为中国领先的品牌化电商服务商,杭州品融电商(PINKROON)…...
02.Golang 切片(slice)源码分析(一、定义与基础操作实现)
Golang 切片(slice)源码分析(一、定义与基础操作实现) 注意当前go版本代码为1.23 一、定义 slice 的底层数据是数组,slice 是对数组的封装,它描述一个数组的片段。两者都可以通过下标来访问单个元素。 数…...
当生产了~/qt-arm/bin/qmake,可以单独编译其他-源码的某个模块,如下,编译/qtmultimedia
cd ~/qt-everywhere-src-5.15.2/qtmultimedia # 设置交叉编译器和 qmake 路径 export CC/usr/bin/aarch64-linux-gnu-gcc export CXX/usr/bin/aarch64-linux-gnu-g export QMAKE~/qt-arm/bin/qmake # 使用已安装的 qmake export QT_INSTALL_PREFIX~/qt-arm # 安装路径 # 配…...
WordPress 网站上的 jpg、png 和 WebP 图片插件
核心功能 1. 转换 AVIF 并压缩 AVIF 将您 WordPress 网站上的 jpg、png 和 WebP 图片转换为 AVIF 格式,并根据您设置的压缩级别压缩 AVIF 图片。如果原始图片已经是 WordPress 6.5 以上支持的 AVIF 格式,则原始 AVIF 图片将仅被压缩。 2. 转换 WebP 并…...
构造+简单树状
昨日的牛客周赛算是比较简单的,其中最后一道构造题目属实眼前一亮。 倒数第二个题目也是一个很好的模拟题目(考验对二叉树的理解和代码的细节) 给定每一层的节点个数,自己拟定一个父亲节点,构造一个满足条件的二叉树。…...
Flask支持哪些日志框架
目录 ✅ Flask 默认支持的日志框架 ✅ 默认推荐:logging(标准库) ✅ 进阶推荐:Loguru(更优雅的日志库) ✅ Flask 日志级别说明(与标准库一致) ✅ 生产环境建议 ✅ 总结推荐 在 Flask 中,默认的日志系统是基于 Python 标准库 logging 模块 构建的。 ✅ Flask 默认…...
健康养生指南:解锁活力生活的科学密码
健康是人生最珍贵的财富,在快节奏的现代生活中,掌握科学的养生方法至关重要。虽然不借助中医理念,我们依然可以从饮食、运动、睡眠等多个方面入手,打造健康生活方式。 合理的饮食是健康的基石。遵循均衡饮食原则,保证每…...
SAR图像压缩感知
SAR图像压缩感知 matlab代码 对应着汕大闫老师的那本压缩感知及其应用,有需要的可以看一下!! SAR图像压缩感知/baboon.bmp , 66616 SAR图像压缩感知/camera.bmp , 66616 SAR图像压缩感知/DWT.m , 1265 SAR图像压缩感知/Gauss.m , 373 SAR图像…...
定时器设计
定时器设计的必要性 服务器中的定时器设计具有多方面的必要性,主要体现在以下几个关键方面: 任务调度与管理 定时任务执行:服务器常常需要执行一些定时性的任务,如定时备份数据、定时清理缓存、定时更新系统日志等。通过定时器可…...
Spring Boot整合Kafka实战指南:从环境搭建到消息处理全解析
一、环境准备 安装 Kafka 下载 Kafka:从 Apache Kafka 官网下载对应版本的 Kafka。 解压并启动 Kafka: # 启动 Zookeeper(Kafka 依赖 Zookeeper) bin/zookeeper-server-start.sh config/zookeeper.properties# 启动 Kafka bin/ka…...
(done) 补充:xv6 的一个用户程序 init 是怎么启动的 ?它如何启动第一个 bash ?
先看 main.c 从函数名来看,比较相关的就 userinit() 和 scheduler() #include "types.h" #include "param.h" #include "memlayout.h" #include "riscv.h" #include "defs.h"volatile static int started 0;//…...
AI 搜索引擎 MindSearch
背景 RAG是一种利用文档减少大模型的幻觉,AI搜索也是 AI 搜索引擎 MindSearch 是一个开源的 AI 搜索引擎框架,具有与 Perplexity.ai Pro 相同的性能。您可以轻松部署它来构建您自己的搜索引擎,可以使用闭源 LLM(如 GPT、Claude…...
HTML简单语法标签(后续实操:云备份项目)
以下是一些 HTML 的简单语法标签及其功能介绍: 基本结构标签 <!DOCTYPE html>:声明文档类型为 HTML5<html>:HTML 文档的根标签<head>:包含文档元数据(如标题、字符编码等)<title>…...
CentOS 和 RHEL
CentOS 和 RHEL(Red Hat Enterprise Linux)关系非常紧密,简而言之: CentOS 最初是 RHEL 的免费、开源克隆版,几乎与 RHEL 二进制兼容。 CentOS 原是 RHEL 的“免费双胞胎”,但已被放弃,现在推荐…...
java----------->代理模式
目录 什么是代理模式? 为什么会有代理模式? 怎么写代理模式? 实现代理模式总共需要三步: 什么是代理模式? 代理模式:给目标对象提供一个代理对象,并且由代理对象控制目标对象的引用 代理就是…...
Wpf学习片段
IRegionManager 和IContainerExtension IRegionManager 是 Prism 框架中用于管理 UI 区域(Regions)的核心接口,它实现了模块化应用中视图(Views)的动态加载、导航和生命周期管理。 IContainerExtension 是依赖注入&…...
智能手表测试用例文档
智能手表测试用例文档 产品名称:智能手表 A1 版本号:FW v1.0.0 测试负责人:[填写] 编写时间:2025-xx-xx 文档状态:初次版本 📁 测试用例结构说明 字段描述用例编号测试用例唯一编号,如 TC-FUN…...
密码学--希尔密码
一、实验目的 1、通过实现简单的古典密码算法,理解密码学的相关概念 2、理解明文、密文、加密密钥、解密密钥、加密算法、解密算法、流密码与分组密码等。 二、实验内容 1、题目内容描述 ①定义分组字符长度 ②随机生成加密密钥,并验证密钥的可行性 …...
配置Hadoop集群-集群配置
以下是 Hadoop 集群的核心配置步骤,基于之前的免密登录和文件同步基础,完成 Hadoop 分布式环境的搭建: 1. 集群规划 假设集群包含 3 个节点: master:NameNode、ResourceManagerslave1:DataNode、NodeMana…...
第三方软件测评中心分享:软件功能测试类型和测试工具
在数字化时代,软件测试已成为确保产品质量的重要环节。功能测试作为软件测试中的核心部分,关注于软件产品是否按预期功能正常运作。 软件功能测试可以按不同的方式进行分类,主要包括以下几种类型: 1.正功能测试:验…...
Profibus DP主站与Modbus RTU/TCP网关与海仕达变频器轻松实现数据交互
Profibus DP主站与Modbus RTU/TCP网关与海仕达变频器轻松实现数据交互 Profibus DP主站转Modbus RTU/TCP(XD-MDPBm20)网关在Profibus总线侧实现主站功能,在Modbus串口侧实现从站功能。可将ProfibusDP协议的设备(如:海…...
多视角系统,视角之间的切换,输入操作。无人机Pawn视角的实现
一.创建自己的PlayerController。它相当于是灵魂,穿梭在不同Pawn之间。也即是切换视角。不同输入的响应也写在这里。这样即使,都有鼠标操作,也能区分。避免了代码的重复耦合。也可以叫做视角系统。 class LZJGAMEMODE_API ALZJPlayerControl…...
[学习]RTKLib详解:ionex.c、options.c与preceph.c
RTKLib详解:ionex.c、options.c与preceph.c 本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。 [学习] RTKlib详解:功能、工具与源码结构解析 [学习]RTKLib详解&…...
【Linux笔记】——进程信号的保存
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux笔记】——进程信号的产生 🔖流水不争,争的是滔滔不 一、信号的相关概念二、信…...
教育机构教务管理系统哪个好?
在当今教育培训行业快速发展的背景下,一个高效、专业的教务管理系统已成为教育机构提升运营效率、优化教学质量的关键工具。本文将深入分析爱耕云教务管理系统的核心优势,通过具体功能解析和代码示例展示其技术实现方式,并对比市场上其他主流…...