《Java 简易速速上手小册》第7章:Java 网络编程(2024 最新版)

在这里插入图片描述

文章目录

  • 7.1 网络基础和 Java 中的网络 - 揭开神秘的面纱
    • 7.1.1 基础知识
    • 7.1.2 重点案例:实现一个简单的聊天程序
    • 7.1.3 拓展案例 1:使用 UDP 进行消息广播
    • 7.1.4 拓展案例 2:建立一个简单的 Web 服务器
  • 7.2 创建客户端和服务器 - 构建沟通的桥梁
    • 7.2.1 基础知识
    • 7.2.2 重点案例:实现文件传输系统
    • 7.2.3 拓展案例 1:构建简单的聊天应用
    • 7.2.4 拓展案例 2:多客户端支持的服务器
  • 7.3 高效网络编程技巧 - 提升你的网络魔法效率
    • 7.3.1 基础知识
    • 7.3.2 重点案例:基于 NIO 的聊天服务器
    • 7.3.3 拓展案例 1:使用线程池处理 Socket 连接
    • 7.3.4 拓展案例 2:优化长连接的性能

7.1 网络基础和 Java 中的网络 - 揭开神秘的面纱

在这个章节,我们将像是揭开一个神秘世界的面纱,探索网络通信的基础知识,并了解如何在Java中应用这些知识来建立连接和进行数据交换。

7.1.1 基础知识

  • IP地址:每台连接到网络的设备都有一个唯一的IP地址,用于标识设备在网络上的位置,类似于现实世界中的邮寄地址。

  • 端口号:端口号用于标识设备上的特定程序,允许一个IP地址提供多种不同的服务。想象一下,一个大楼(IP地址)有多扇门(端口号),每扇门后都是不同的服务。

  • TCP和UDP:TCP(传输控制协议)提供了一种可靠的数据传输方式,确保数据完整无误地从源传到目的地;而UDP(用户数据报协议)则是一种简单的协议,不保证数据的可靠传输,但在某些情况下能提供更快的数据传输速度。

  • Socket编程:Socket是网络编程的基石,提供了建立TCP连接和数据传输的方法。在Java中,通过java.net包中的Socket类和ServerSocket类,我们可以轻松实现网络通信。

7.1.2 重点案例:实现一个简单的聊天程序

我们将创建一个简单的聊天程序,其中包含一个服务器和一个客户端,演示基于TCP的Socket通信。

服务器端:

import java.io.*;
import java.net.*;public class ChatServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(5555);System.out.println("Server is waiting for client...");Socket clientSocket = serverSocket.accept();PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));String inputLine;while ((inputLine = in.readLine()) != null) {System.out.println("Client says: " + inputLine);out.println("Echo: " + inputLine);}}
}

客户端:

import java.io.*;
import java.net.*;public class ChatClient {public static void main(String[] args) throws IOException {Socket socket = new Socket("localhost", 5555);PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));String userInput;while ((userInput = stdIn.readLine()) != null) {out.println(userInput);System.out.println("Server response: " + in.readLine());}}
}

7.1.3 拓展案例 1:使用 UDP 进行消息广播

除了TCP,我们还可以使用UDP进行数据传输。下面是一个简单的使用UDP进行消息广播的示例。

广播消息:

import java.net.*;public class UdpBroadcast {public static void main(String[] args) throws IOException {DatagramSocket socket = new DatagramSocket();byte[] buf = "Hello, UDP!".getBytes();InetAddress address = InetAddress.getByName("255.255.255.255");DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445);socket.send(packet);socket.close();}
}

7.1.4 拓展案例 2:建立一个简单的 Web 服务器

使用Java的ServerSocket,我们可以建立一个简单的Web服务器,响应HTTP请求。

import java.io.*;
import java.net.*;public class SimpleWebServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8080);while (true) {Socket clientSocket = serverSocket.accept();PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);out.println("HTTP/1.1 200 OK");out.println("Content-Type: text/html");out.println("\r\n");out.println("<h1>Hello, World!</h1>");clientSocket.close();}}
}

通过这些案例,我们可以看到网络编程并不是什么遥不可及的技术。无论是实现基于TCP的聊天程序,使用UDP进行数据广播,还是建立一个简单的Web服务器,Java都为我们提供了强大的工具。现在,拿起你的工具,开始在Java的网络世界中探险吧!

在这里插入图片描述


7.2 创建客户端和服务器 - 构建沟通的桥梁

在Java网络编程的旅程中,创建客户端和服务器是基本而关键的一步,就像是在两座孤岛之间构建沟通的桥梁。客户端和服务器之间的交流基础是建立在网络协议之上的,而TCP/IP协议是最常用的协议之一,它能够确保数据的可靠传输。

7.2.1 基础知识

  • Socket:在Java中,Socket是实现网络通信的核心,客户端通过Socket连接到服务器,服务器接受客户端的连接请求来建立连接。

  • ServerSocket:在服务器端,ServerSocket用于监听来自客户端的连接请求。

  • TCP连接的建立:客户端通过指定服务器的IP地址和端口号发起连接请求,服务器监听到请求后,通过接受请求来建立连接。

7.2.2 重点案例:实现文件传输系统

假设我们要构建一个简单的文件传输系统,允许客户端向服务器上传文件。

服务器端:

import java.io.*;
import java.net.*;public class FileTransferServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(6666);System.out.println("Server is running and waiting for file...");Socket socket = serverSocket.accept();DataInputStream dis = new DataInputStream(socket.getInputStream());FileOutputStream fos = new FileOutputStream("received_file.txt");byte[] buffer = new byte[4096];int filesize = 15123; // Send file size in separate msgint read = 0;int totalRead = 0;int remaining = filesize;while((read = dis.read(buffer, 0, Math.min(buffer.length, remaining))) > 0) {totalRead += read;remaining -= read;System.out.println("read " + totalRead + " bytes.");fos.write(buffer, 0, read);}fos.close();dis.close();System.out.println("File received!");}
}

客户端:

import java.io.*;
import java.net.*;public class FileTransferClient {public static void main(String[] args) throws IOException {Socket socket = new Socket("localhost", 6666);FileInputStream fis = new FileInputStream("to_send_file.txt");DataOutputStream dos = new DataOutputStream(socket.getOutputStream());byte[] buffer = new byte[4096];while (fis.read(buffer) > 0) {dos.write(buffer);}fis.close();dos.close();System.out.println("File sent!");}
}

7.2.3 拓展案例 1:构建简单的聊天应用

我们可以通过Socket编程构建一个更实用的应用,比如一个简单的聊天应用,允许客户端和服务器互发消息。

聊天服务器

服务器端的任务是接受客户端连接,并转发客户端发送的消息到所有其他已连接的客户端。

import java.io.*;
import java.net.*;
import java.util.*;
import java.util.concurrent.*;public class ChatServer {private static final int PORT = 6666;private static final List<ClientHandler> clients = new CopyOnWriteArrayList<>();private static ExecutorService pool = Executors.newCachedThreadPool();public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(PORT);System.out.println("Chat Server is listening on port " + PORT);while (true) {Socket clientSocket = serverSocket.accept();System.out.println("Accepted new connection from " + clientSocket);ClientHandler clientHandler = new ClientHandler(clientSocket, clients);clients.add(clientHandler);pool.execute(clientHandler);}}
}class ClientHandler implements Runnable {private Socket clientSocket;private List<ClientHandler> clients;private PrintWriter out;private BufferedReader in;public ClientHandler(Socket socket, List<ClientHandler> clients) throws IOException {this.clientSocket = socket;this.clients = clients;this.out = new PrintWriter(clientSocket.getOutputStream(), true);this.in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));}@Overridepublic void run() {try {String message;while ((message = in.readLine()) != null) {broadcastMessage(message);}} catch (IOException e) {System.out.println("Error in ClientHandler: " + e.getMessage());} finally {try {in.close();out.close();clientSocket.close();} catch (IOException e) {e.printStackTrace();}}}private void broadcastMessage(String message) {for (ClientHandler aClient : clients) {if (aClient != this) {aClient.out.println(message);}}}
}

聊天客户端

客户端的任务是连接到服务器,发送自己的消息,并接收从服务器转发的其他客户端的消息。

import java.io.*;
import java.net.*;public class ChatClient {private static final String SERVER_IP = "127.0.0.1";private static final int SERVER_PORT = 6666;public static void main(String[] args) throws IOException {Socket socket = new Socket(SERVER_IP, SERVER_PORT);BufferedReader keyboardInput = new BufferedReader(new InputStreamReader(System.in));PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// Create a new thread to read messages from the servernew Thread(new Runnable() {public void run() {try {String serverMessage;while ((serverMessage = in.readLine()) != null) {System.out.println("Server says: " + serverMessage);}} catch (IOException e) {System.out.println("Connection to server broken.");}}}).start();// Read messages from the keyboard and send them to the serverSystem.out.println("Enter your message: ");String userInput;while ((userInput = keyboardInput.readLine()) != null) {out.println(userInput);}}
}

在这个聊天应用中,服务器能够接收多个客户端连接,并将任一客户端发来的消息广播给所有其他客户端。客户端可以发送消息给服务器,服务器则将这些消息转发给所有其他已连接的客户端。这样,就实现了一个基础的多人聊天室功能。

7.2.4 拓展案例 2:多客户端支持的服务器

要让服务器能够同时处理多个客户端,我们可以为每个连接创建一个新的线程来处理。

服务器端:

public class MultiClientServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(6666);System.out.println("Server is running...");while (true) {Socket socket = serverSocket.accept();new Thread(new ClientHandler(socket)).start();}}
}class ClientHandler implements Runnable {private Socket socket;public ClientHandler(Socket socket) {this.socket = socket;}@Overridepublic void run() {// 处理客户端请求}
}

通过实现这些案例,你已经学会了如何在Java中创建客户端和服务器,以及如何通过Socket进行基本的网络通信。无论是实现文件传输系统、构建简单的聊天应用,还是支持多客户端的服务器,这些基础知识都将为你打开网络编程的大门,帮助你构建更复杂和强大的网络应用。

在这里插入图片描述


7.3 高效网络编程技巧 - 提升你的网络魔法效率

在Java网络编程的世界中,掌握一些高效的技巧可以大大提升你的应用性能和用户体验。就像一个熟练的魔法师,通过精细的魔法控制和策略,可以在战斗中取得压倒性的胜利。让我们一起探索如何成为网络编程领域的高级魔法师。

7.3.1 基础知识

  • 非阻塞I/O(NIO):Java NIO是一种基于通道(Channel)和缓冲区(Buffer)的I/O方式,它可以让你非阻塞地读写数据,提升I/O操作的效率。

  • I/O多路复用:这是一种允许单个线程同时监控多个I/O通道的技术,如果某个通道准备好了I/O操作,系统就会通知线程。这减少了线程的数量和上下文切换的开销。

  • 线程池:使用线程池可以避免为每个请求创建新线程的开销,复用线程资源,提高应用性能。

  • 连接池:网络应用中,频繁地建立和关闭连接会造成资源的浪费,使用连接池可以复用已经建立的连接。

7.3.2 重点案例:基于 NIO 的聊天服务器

我们将构建一个基于Java NIO的聊天服务器,这个服务器可以非阻塞地处理多个客户端的连接和消息传输。

聊天服务器:

import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.util.*;public class ChatServer {public void startServer() throws IOException {Selector selector = Selector.open();ServerSocketChannel serverChannel = ServerSocketChannel.open();serverChannel.bind(new InetSocketAddress(5555));serverChannel.configureBlocking(false);serverChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {selector.select(); // 阻塞,直到至少有一个通道在你注册的事件上就绪了Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> iter = selectedKeys.iterator();while (iter.hasNext()) {SelectionKey key = iter.next();if (key.isAcceptable()) {register(selector, serverChannel);}if (key.isReadable()) {broadcast(selector, key);}iter.remove();}}}private void register(Selector selector, ServerSocketChannel serverChannel) throws IOException {SocketChannel client = serverChannel.accept();client.configureBlocking(false);client.register(selector, SelectionKey.OP_READ);}private void broadcast(Selector selector, SelectionKey key) throws IOException {SocketChannel client = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(256);client.read(buffer);String message = new String(buffer.array()).trim();for (SelectionKey k : selector.keys()) {Channel target = k.channel();if (target instanceof SocketChannel && target != client) {((SocketChannel) target).write(ByteBuffer.wrap(message.getBytes()));}}}public static void main(String[] args) throws IOException {new ChatServer().startServer();}
}

7.3.3 拓展案例 1:使用线程池处理 Socket 连接

在多用户网络应用中,使用线程池来处理Socket连接可以大大提升性能。

import java.net.*;
import java.util.concurrent.*;public class ThreadPoolEchoServer {private static final int PORT = 5555;private static final ExecutorService pool = Executors.newFixedThreadPool(10);public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(PORT);System.out.println("Echo server is running.");while (true) {Socket clientSocket = serverSocket.accept();pool.execute(new EchoClientHandler(clientSocket));}}
}class EchoClientHandler implements Runnable {private Socket clientSocket;public EchoClientHandler(Socket socket) {this.clientSocket = socket;}@Overridepublic void run() {// 处理客户端请求}
}

7.3.4 拓展案例 2:优化长连接的性能

在需要维护长时间连接的应用中,合理管理这些连接是提升性能的关键。

优化长连接的性能是网络编程中的一个常见需求,尤其是在需要维护与客户端持续交互的应用中。以下是一个使用Java实现的简单心跳机制和连接池管理来优化长连接性能的示例。

**心跳机制:**心跳机制(Heartbeat)用于维持客户端与服务器之间的长连接,通过定期发送轻量级的心跳消息来确认连接的活性。

服务器端示例:

import java.io.*;
import java.net.*;
import java.util.concurrent.*;public class HeartbeatServer {private static final int PORT = 5555;private static final ExecutorService pool = Executors.newCachedThreadPool();public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(PORT);System.out.println("Server started, waiting for connections...");while (true) {Socket clientSocket = serverSocket.accept();pool.execute(new ClientHandler(clientSocket));}}static class ClientHandler implements Runnable {private final Socket clientSocket;public ClientHandler(Socket socket) {this.clientSocket = socket;}@Overridepublic void run() {try (DataInputStream dis = new DataInputStream(clientSocket.getInputStream());DataOutputStream dos = new DataOutputStream(clientSocket.getOutputStream())) {while (true) {String message = dis.readUTF(); // Read heartbeat messageif ("HEARTBEAT".equals(message)) {dos.writeUTF("ACK"); // Acknowledge heartbeat} else {// Handle other messages}}} catch (IOException e) {System.out.println("Client disconnected.");}}}
}

客户端示例:

import java.io.*;
import java.net.*;public class HeartbeatClient {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 5555);DataOutputStream dos = new DataOutputStream(socket.getOutputStream());DataInputStream dis = new DataInputStream(socket.getInputStream())) {while (true) {dos.writeUTF("HEARTBEAT"); // Send heartbeat messageString response = dis.readUTF(); // Wait for server acknowledgmentif ("ACK".equals(response)) {System.out.println("Heartbeat acknowledged by server.");}Thread.sleep(5000); // Send heartbeat every 5 seconds}} catch (IOException | InterruptedException e) {System.out.println("Error: " + e.getMessage());}}
}

连接池管理

在需要维护多个长连接时,使用连接池可以提高资源的复用率和应用性能。虽然Java标准库中没有直接支持连接池的API,但我们可以通过第三方库如Apache Commons Pool或HikariCP来实现连接池管理。以下是概念性描述,具体实现将依赖于选用的连接池库:

// 创建连接池配置
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/yourdatabase");
config.setUsername("user");
config.setPassword("password");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");// 实例化连接池
HikariDataSource dataSource = new HikariDataSource(config);// 使用连接池获取连接
try (Connection conn = dataSource.getConnection();PreparedStatement stmt = conn.prepareStatement("your SQL query")) {// 处理数据库操作
} catch (SQLException e) {// 异常处理
}

通过这些技术,你可以有效地管理长连接,提升应用的性能和稳定性。心跳机制确保连接的活性,而连接池管理则提高了资源的利用率和响应速度。这些高级技巧将在网络编程中赋予你更大的力量和灵活性。

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

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

相关文章

Netty源码系列 之 FastThreadLocal源码

目录 Netty优化方案之 FastThreadLocal 前言 ThreadLocal ThreadLocal是干什么的&#xff1f; 为什么要使用ThreadLocal工具类去操控存取目标数据到Thread线程 &#xff1f; ThreadLocal的使用场景 目标数据存储到Thread线程对象的哪里&#xff1f; 怎么样把一个目标数据…

学习Android的第六天

目录 Android TextView 文本框 TextView 基础属性 范例 带阴影的TextView 范例 带边框的TextView 范例 带图片(drawableXxx)的TextView 范例1 范例2 使用autoLink属性识别链接类型 范例 TextView 显示简单的 HTML 范例1 范例2 SpannableString & Spannable…

政安晨:演绎在KerasCV中使用Stable Diffusion进行高性能图像生成

小伙伴们好&#xff0c;咱们今天演绎一个使用KerasCV的StableDiffusion模型生成新的图像的示例。 考虑计算机性能的因素&#xff0c;这次咱们在Colab上进行&#xff0c;Colab您可以理解为在线版的Jupyter Notebook&#xff0c;还不熟悉Jupyter的的小伙伴可以去看一下我以前的文…

python+ flask+MySQL旅游数据可视化81319-计算机毕业设计项目选题推荐(免费领源码)

摘要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对旅游数据可视化等问题&#xff0c;对旅游数据…

[英语学习][28][Word Power Made Easy]的精读与翻译优化

[序言] 译者的这次翻译, 如果按照一一对应的单词翻译&#xff0c;正确率是100%, 但可惜的是, 从整体的翻译上, 正确率下降到30%. 也就是说没有正确表达出作者的逻辑. [英文学习的目标] 提升自身的英语水平, 对日后编程技能的提升有很大帮助. 希望大家这次能学到东西, 同时加入…

端口映射原理及实验概要

端口映射是一种网络技术&#xff0c;用于将外部网络请求定向到内部网络中的特定服务或设备。其原理可以分为两个部分&#xff1a;NAT&#xff08;Network Address Translation&#xff09;和端口转发。 NAT是一种将网络数据包的目标IP地址和端口从一个网络地址转换为另一个网络…

Git仓库

1、安装 sudo yum install -y git 2、什么叫版本控制Git&&Gitee&&Github 对源代码的历史修改进行维护&#xff0c;保留历史的所有的修改痕迹。 在Linux中&#xff0c;版本控制是指对软件、文档等项目的不同版本进行管理和追踪的过程。通常使用版本控制系统&…

图表自动化开篇

目录 前言&#xff1a; 使用 Canvas 或者 SVG 渲染 选择哪种渲染器 代码触发 ECharts 中组件的行为 前言&#xff1a; 图表自动化一直以来是自动化测试中的痛点&#xff0c;也是难点&#xff0c;痛点在于目前越来越多公司开始构建自己的BI报表平台但是没有合适的自动化测试…

BLE蓝牙安全机制

1. 蓝牙配对 蓝牙配对是建立安全连接的关键过程。对于传统蓝牙应采用SSP配对方式&#xff0c;而低功耗蓝牙4.0和4.1的版本应使用legacy pairing配对方式&#xff0c;4.2以后的版本应采用Secure connection的配对方式。 传统的蓝牙采用的配对方式如下&#xff1a; 蓝牙2.1版本…

1012: 【C1】【循环】【入门】均值

题目描述 给出一组样本数据&#xff0c;计算其均值。 输入 输入有两行&#xff0c;第一行包含一个整数n&#xff08;1&#xff1c;n&#xff1c;100&#xff09;&#xff0c;代表样本容量&#xff1b;第二行包含n个绝对值不超过1000的浮点数&#xff0c;代表各个样本数据。 …

《Linux 简易速速上手小册》第4章: 包管理与软件安装(2024 最新版)

文章目录 4.1 包管理基础4.1.1 重点基础知识4.1.2 重点案例&#xff1a;在 Ubuntu 上安装和管理软件4.1.3 拓展案例 1&#xff1a;添加软件仓库4.1.4 拓展案例 2&#xff1a;回滚软件到旧版本 4.2 使用 APT 与 YUM4.2.1 重点基础知识4.2.2 重点案例&#xff1a;在 Ubuntu 上配置…

排序刷题11

题目来源&#xff1a;[NOIP1998 提高组] 拼数 - 洛谷 解题思路&#xff1a;这道题重点在于怎么把数字拼接&#xff0c;得到最大的值。这里可以用to_string&#xff08;&#xff09;函数&#xff0c;将数字先转换为字符再拼接&#xff0c;最后得到拼接的最大值。ps&#xff1a;…

Kong 负载均衡

负载均衡是一种将API请求流量分发到多个上游服务的方法。负载均衡可以提高整个系统的响应速度&#xff0c;通过防止单个资源过载而减少故障。 在以下示例中&#xff0c;您将使用部署在两台不同服务器或上游目标上的应用程序。Kong网关需要在这两台服务器之间进行负载均衡&…

2024年华为OD机试真题-求幸存数之和-Java-OD统一考试(C卷)

题目描述: 给一个正整数列 nums,一个跳数 jump,及幸存数量 left。运算过程为:从索引为0的位置开始向后跳,中间跳过 J 个数字,命中索引为J+1的数字,该数被敲出,并从该点起跳,以此类推,直到幸存left个数为止。然后返回幸存数之和。 约束: 1)0是第一个起跳点。 2)起…

Java中,List、Map和Set的区别是什么?

在Java中&#xff0c;List、Map和Set是三种常用的集合类型&#xff0c;它们之间的主要区别如下&#xff1a; 1、List List是有序集合&#xff0c;它可以包含重复元素。 List中的元素是按照插入顺序排列的&#xff0c;可以通过索引访问每个元素。 Java中常见的List实现类有A…

简单易懂:一篇文章讲透所有Python知识

Python语法简单&#xff0c;应用领域广&#xff0c;本文给出 Python八大核心知识点&#xff0c;供大家迅速上手&#xff0c;建议收藏。 第一部分&#xff1a;基础语法 # 6种数据类型# 整数、浮点数、字符串 x 2 y 3.1415926 name "You jump, I jump"# 列表、元组…

嵌入式Qt 计算器界面设计

一.计算器界面设计 计算机界面程序分析&#xff1a; 需要用到的组件&#xff1a; 界面设计&#xff1a; 界面设计实现&#xff1a; 实验1&#xff1a;计算器界面设计 #include <QtGui/QApplication> #include <QWidget> //主窗口 #include <QLineEdit> //文…

2024年2月5日-2月11日周报

论文阅读 1. 本周计划2. 完成情况2.1 论文摘要2.2 网络结构2.3 损失函数2.4 优化器2.5 代码2.5.1 代码结果2.5.2 代码大致流程 4. 总结及收获4. 下周计划 1. 本周计划 阅读论文《Data-Driven Seismic Waveform Inversion: A Study on the Robustness and Generalization》并实…

桥接模式:连接抽象与实现的设计艺术

桥接模式&#xff1a;连接抽象与实现的设计艺术 在软件开发中&#xff0c;设计模式是帮助我们以优雅的方式解决问题的模板。桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它的主要目标是将抽象部分与实现部分分离&#xff0c;这样两者可以…

五.实战软件部署 1-3实战章节-前言MYSQL 5.7版本在centos系统安装MYSQL 8.0版本在centos系统安装

目录 五.实战软件部署 1-实战章节-前言 五.实战软件部署 2-MYSQL 5.7版本在centos系统安装 1-配置yum仓库 2-使用yum安装mysql 3-安装完成后&#xff0c;启动mysql并配置开机自启动 4-检查mysql的运行状态 --配置 1-获取mysql的初识密码 2-登录mysql数据库系统 3-修改…