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

《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) {// 异常处理
}

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

相关文章:

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

文章目录 7.1 网络基础和 Java 中的网络 - 揭开神秘的面纱7.1.1 基础知识7.1.2 重点案例&#xff1a;实现一个简单的聊天程序7.1.3 拓展案例 1&#xff1a;使用 UDP 进行消息广播7.1.4 拓展案例 2&#xff1a;建立一个简单的 Web 服务器 7.2 创建客户端和服务器 - 构建沟通的桥…...

用keras对电影评论进行情感分析

文章目录 下载IMDb数据读取IMDb数据建立分词器将评论数据转化为数字列表让转换后的数字长度相同加入嵌入层建立多层感知机模型加入平坦层加入隐藏层加入输出层查看模型摘要 训练模型评估模型准确率进行预测查看测试数据预测结果完整函数用RNN模型进行IMDb情感分析用LSTM模型进行…...

每日OJ题_算法_递归④力扣24. 两两交换链表中的节点

目录 ④力扣24. 两两交换链表中的节点 解析代码 ④力扣24. 两两交换链表中的节点 24. 两两交换链表中的节点 难度 中等 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即…...

110 C++ decltype含义,decltype 主要用途

一&#xff0c;decltype 含义和举例 decltype有啥返回啥&#xff0c;auto则不一样&#xff0c;auto可能会舍弃一些东西。 decltype 是 C11提出的说明符。主要作用是&#xff1a;返回操作数的数据类型。 decltype 是用来推导类型&#xff0c;decltype对于一个给定的 变量名或…...

PYTHON 120道题目详解(85-87)

85.Python中如何使用enumerate()函数获取序列的索引和值&#xff1f; enumerate()函数是Python的内置函数&#xff0c;它可以将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列&#xff0c;同时列出数据和数据下标&#xff0c;一般用在for循环当中。 以下是一个…...

【Linux】Linux编译器-gcc/g++ Linux项目自动化构建工具-make/Makefile

目录 Linux编译器-gcc/g使用 1.背景知识 Linux中头文件的目录在 Linux 库 条件编译的典型应用 2.gcc如何完成 动态库 vs 静态库 debug && release Linux项目自动化构建工具-make/Makefile 背景 用法 特殊符号 Linux编译器-gcc/g使用 1.背景知识 预处理&am…...

sqlserver 子查询 =,in ,any,some,all的用法

在 SQL Server 中&#xff0c;子查询常用于嵌套在主查询中的子句中&#xff0c;以便根据子查询的结果集来过滤主查询的结果&#xff0c;或者作为主查询的一部分来计算结果。 以下是 、IN、ANY、SOME 和 ALL 运算符在子查询中的用法示例&#xff1a; 使用 运算符进行子查询&a…...

基于MapVGL的地理信息三维度数据增长可视化

写在前面 工作中接触&#xff0c;简单整理博文内容为 基于MapVGL的地理信息维度数据增长可视化 Demo理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都…...

天锐绿盾|防泄密系统|计算机文件数据\资料安全管理软件

“天锐绿盾”似乎是一款专注于防泄密和计算机文件数据/资料安全管理的软件。在信息安全日益受到重视的今天&#xff0c;这样的软件对于保护企业的核心数据资产和防止敏感信息泄露至关重要。 通用地址&#xff1a;www.drhchina.com 防泄密系统的主要功能通常包括&#xff1a; 文…...

leetcode刷题(罗马数字转数字)

1.题目描述 2.解题思路 这时候已经给出了字母对应的数字&#xff0c;我们只需要声明一个字典&#xff0c;将罗马数字和数字之间的对应关系声明即可。其中可能涉及到会出现两个连续的罗马字母代表一个数字&#xff0c;这时候我们需要判断遍历的字符和将要遍历的下一个字符是否存…...

什么是NAT网关?联通云NAT网关有什么优势

在当今云计算时代&#xff0c;网络安全和连接性是企业发展的关键因素之一。NAT网关&#xff08;Network Address Translation Gateway&#xff09;是一种网络设备&#xff0c;它可以在私有网络和公共网络之间进行地址转换&#xff0c;从而使得内部网络中的设备能够与外部网络进…...

CVE-2023-41892 漏洞复现

CVE-2023-41892 开题&#xff0c;是一个RCE Thanks for installing Craft CMS! You’re looking at the index.twig template file located in your templates/ folder. Once you’re ready to start building out your site’s front end, you can replace this with someth…...

【每日一题】06 排序链表

问题描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 求解 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* sortList(struct ListNode* head) {struct…...

【精品】关于枚举的高级用法

枚举父接口 public interface BaseEnum {Integer getCode();String getLabel();/*** 根据值获取枚举** param code* param clazz* return*/static <E extends Enum<E> & BaseEnum> E getEnumByCode(Integer code, Class<E> clazz) {Objects.requireNonN…...

Vue2学习第一天

Vue2 学习第一天 1. 什么是 vue? Vue 是一套用于构建用户界面的渐进式框架。 2. vue 历史 vue 是在 2013 年创建的&#xff0c;vue3 是 2020 出现的&#xff0c;现在主要是用 vue2&#xff0c;创新公司用的是 vue3 vue 的作者是尤雨溪&#xff0c;vue 的搜索热度比 react…...

HAL STM32通过multi_button库处理按键事件

HAL STM32通过multi_button库处理按键事件 &#x1f4cd;作者&#xff1a;0x1abin的multi_button库:https://github.com/0x1abin/MultiButton &#x1f4d8;MultiButton简介 MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块&#xff0c;可无限量扩展按键&#xff0c;…...

随机过程及应用学习笔记(一)概率论(概要)

概率是随机的基础&#xff0c;在【概率论&#xff08;概要&#xff09;】这个部分中仅记录学习随机过程及应用的基本定义和结果。 前言 首先&#xff0c;概率论研究的基础是概率空间。概率空间由一个样本空间和一个概率测度组成&#xff0c;样本空间包含了所有可能的结果&…...

洛谷_P1059 [NOIP2006 普及组] 明明的随机数_python写法

这道题的关键在于去重和排序&#xff0c;去重可以联想到集合&#xff0c;那排序直接使用sort方法。 n int(input()) data set(map(int,input().split( ))) data list(data) data.sort() print(len(data)) for i in data:print(i,end )...

爆火的人工智能开源open-interpreter源码解析

今天这篇文章带大家一起来阅读下github上爆火的开源项目 open-interpreter的源代码&#xff0c;相当于是一个可以本地部署的openai code-interpreter。 今天这期我们透过现象看本质&#xff0c;一起来剖析下他的源码。 体验open-interpreter的视频地址 open-interpreter&…...

POM设计模式思路,详解POM:概述与介绍,POM思路梳理+代码示例(全)

概述 在UI自动化测试中&#xff0c;POM模式是一种设计思路&#xff0c;它的核心思想是方法的封装。它将方法类和页面元素进行分离&#xff0c;增强了代码的可维护性。值得注意的是&#xff0c;这种分层的设计模式&#xff0c;最好也是从线性代码开始&#xff0c;逐步将代码进行…...

1、学习 Eureka 注册中心

学习 Eureka 注册中心 一、创建 Eureka 微服务0、SpringBoot 和 SpringCloud 版本1、引入 Eureka 服务端依赖2、启动类加 EnableEurekaServer 注解3、配置 yaml 文件&#xff0c;把 Eureka 服务注册到 Eureka 注册中心4、访问 Eureka 服务端&#xff0c;查看注册中心的服务列表…...

何为分账系统?

1、分账系统产生的背景 在数字化浪潮下第三方支付价值凸显&#xff0c;大大提升资金流与信息流流转效率&#xff0c;成为构建产业数字化重要枢纽。近年来&#xff0c;基于云计算、大数据、人工智能、物联网等技术积累&#xff0c;以第三方支付为切点的金融科技创新爆发着强大的…...

机器学习10-特征缩放

特征缩放的目的是确保不同特征的数值范围相近&#xff0c;使得模型在训练过程中更加稳定&#xff0c;加速模型收敛&#xff0c;提高模型性能。具体而言&#xff0c;零均值和单位方差的目标有以下几点好处&#xff1a; 1. 均值为零&#xff08;Zero Mean&#xff09;&#xff1a…...

Java基于微信小程序的医院挂号小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

HarmonyOS一杯冰美式的时间 -- 验证码框

一、前言 像是短密码、验证码都有可能需要一个输入框&#xff0c;像是如下&#xff1a; 恰好在写HarmonyOS的时候也需要写一个验证码输入框&#xff0c;但是在实现的时候碰了几次灰&#xff0c;觉得有必要分享下&#xff0c;故有了此篇文章。 如果您有任何疑问、对文章写的不…...

GitLab配置SSHKey

段落一&#xff1a;什么是SSH密钥 SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于安全地远程登录和执行命令。SSH密钥是一种用于身份验证的加密文件&#xff0c;它允许您在与远程服务器通信时&#xff0c;无需输入密码即可进行认证。在GitLab中配置S…...

通过QT制作一个模仿微信主界面的界面(不要求实现具体通信功能)

main.cpp #include "widget.h" #include "second.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();//实例化第二个界面Second s;QObject::connect(&w, &Widget::my_jump, &…...

作物模型狂奔:WOFOST(PCSE) 数据同化思路

去B吧&#xff0c;这里没图 整体思路&#xff1a;PCSE -》 敏感性分析 -》调参 -》同化 0、准备工作 0.0 电脑环境 我用的Win10啦&#xff0c;Linux、Mac可能得自己再去微调一下。 0.1 Python IDE 我用的Pycharm&#xff0c;个人感觉最好使的IDE&#xff0c;没有之一。 …...

腾讯云4核8G服务器能支持多少人访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…...

多重背包问题 ⅠⅡ Ⅲ

有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件&#xff0c;每件体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使物品体积总和不超过背包容量&#xff0c;且价值总和最大。 输出最大价值。 输入 第一行两个整数&#xff0c;N&#xf…...

挑战杯 python的搜索引擎系统设计与实现

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python的搜索引擎系统设计与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;5分创新点&#xff1a;3分 该项目较为新颖&#xff…...

【LeetCode: 103. 二叉树的锯齿形层序遍历 + BFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

C#学习(十三)——多线程与异步

一、什么是线程 程序执行的最小单元 一次页面的渲染、一次点击事件的触发、一次数据库的访问、一次登录操作都可以看作是一个一个的进程 在一个进程中同时启用多个线程并行操作&#xff0c;就叫做多线程 由CPU来自动处理 线程有运行、阻塞、就绪三态 代码示例&#xff1a; cl…...

MySQL 数据库安装教程详解(linux系统和windows系统)

MySQL 数据库是一种广泛使用的开源关系数据库管理系统。在 Linux 和 Windows 系统上安装 MySQL 数据库的步骤略有不同。以下是详细的安装教程。 Linux 系统安装教程 1. **安装前提**&#xff1a;确保你的 Linux 系统已经安装了 wget、unzip、tar 等必要的工具。 2. **下…...

从汇编分析C语言可变参数的原理,并实现一个简单的sprintf函数

C语言可变参数 使用printf等函数的时候函数原型是printf(const char* fmt, ...), 这一类参数的个数不限的函数是可变参数 使用 使用一个头文件stdarg.h, 主要使用以下的宏 typedef char * va_list;// 把 n 圆整到 sizeof(int) 的倍数 #define _INTSIZEOF(n) ( (sizeo…...

Word docx文件重命名为zip文件,解压后直接查看和编辑

一个不知道算不算冷的知识[doge]&#xff1a; docx格式的文件本质上是一个ZIP文件 当把一个.docx文件重命名为.zip文件并解压后&#xff0c;你会发现里面包含了一些XML文件和媒体文件&#xff0c;它们共同构成了Word文档的内容和格式。 例如&#xff0c;word/document.xml文件…...

SpringBoot中公共字段的自动填充

目录 1 前言 2 使用方法 2.1 自定义枚举类 2.2 自定义注解AutoFill 2.3 自定义切面类并设定切入点 2.4 切面类中设置前置通知&#xff0c;对公共字段赋值 2.5 在方法上添加自定义注解 3 最后 1 前言 在我们的项目中&#xff0c;项目表可能会有一些公共的字段需要我们的…...

【天衍系列 03】深入理解Flink的Watermark:实时流处理的时间概念与乱序处理

文章目录 01 基本概念02 工作原理03 优势与劣势04 核心组件05 Watermark 生成器 使用06 应用场景07 注意事项08 案例分析8.1 窗口统计数据不准8.2 水印是如何解决延迟与乱序问题&#xff1f;8.3 详细分析 09 项目实战demo9.1 pom依赖9.2 log4j2.properties配置9.3 Watermark水印…...

day07.C++类与对象

一.类与对象的思想 1.1面向对象的特点 封装、继承、多态 1.2类的概念 创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例&#xff08;Instance&#xff09;&#xff0c;拥有类的成员变量和成员函数。由{ }包围&#xff0c;由&#xff1b;结束。 class name{ //类的…...

String讲解

文章目录 String类的重要性常用的方法常用的构造方法String类的比较字符串的查找转化数字转化为字符串字符串转数字 字符串替换字符串的不可变性 字符串拆分字符串截取字符串修改 StringBuilder和StringBuffer String类的重要性 在c/c的学习中我们接触到了字符串&#xff0c;但…...

人群异常聚集监测系统-聚众行为检测与识别算法---豌豆云

聚众识别系统对指定区域进行实时监测&#xff0c;当监测到人群大量聚集、达到设置上限时&#xff0c;立即告警及时疏散。 旅游业作为国民经济战略性支柱产业&#xff0c;随着客流量不断增加&#xff0c;旅游景区和一些旅游城市的管理和服务面临着前所未有的挑战&#xff1a; …...

多模态基础---BERT

1. BERT简介 BERT用于将一个输入的句子转换为word_embedding&#xff0c;本质上是多个Transformer的Encoder堆叠在一起。 其中单个Transformer Encoder结构如下&#xff1a; BERT-Base采用了12个Transformer Encoder。 BERT-large采用了24个Transformer Encoder。 2. BERT的…...

图表示学习 Graph Representation Learning chapter2 背景知识和传统方法

图表示学习 Graph Representation Learning chapter2 背景知识和传统方法 2.1 图统计和核方法2.1.1 节点层次的统计和特征节点的度 节点中心度聚类系数Closed Triangles, Ego Graphs, and Motifs 图层次的特征和图的核节点袋Weisfieler–Lehman核Graphlets和基于路径的方法 邻域…...

OpenMVG(计算两个球形图像之间的相对姿态、细化重建效果)

目录 1 Bundle Adjustment(细化重建效果) 2 计算两个球形图像之间的相对姿态 1 Bundle Adjustment(细化重建效果) 数...

【QT+QGIS跨平台编译】之三十四:【Pixman+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、Pixman介绍二、文件下载三、文件分析四、pro文件五、编译实践一、Pixman介绍 Pixman是一款开源的软件库,提供了高质量的像素级图形处理功能。它主要用于在图形渲染、合成和转换方面进行优化,可以帮助开发人员在应用程序中实现高效的图形处理。 Pixman的主要特…...

2.17学习总结

tarjan 【模板】缩点https://www.luogu.com.cn/problem/P3387 题目描述 给定一个 &#xfffd;n 个点 &#xfffd;m 条边有向图&#xff0c;每个点有一个权值&#xff0c;求一条路径&#xff0c;使路径经过的点权值之和最大。你只需要求出这个权值和。 允许多次经过一条边或者…...

Unity类银河恶魔城学习记录7-7 P73 Setting sword type源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill_Controller.cs using System.Collections; using System.Col…...

安卓版本与鸿蒙不再兼容,鸿蒙开发工程师招疯抢

最近&#xff0c;互联网大厂纷纷开始急招华为鸿蒙开发工程师。这是一个新的信号。在Android和iOS长期霸占市场的今天&#xff0c;鸿蒙的崛起无疑为整个行业带来了巨大的震动。 2023年11月10日&#xff0c;网易更新了高级/资深Android开发工程师岗位&#xff0c;职位要求参与云音…...

《白话C++》第9章 泛型,Page842~844 9.4.2 AutoPtr

源起&#xff1a; C编程中&#xff0c;最容易出的问题之一&#xff0c;就是内存泄露&#xff0c;而new一个对象&#xff0c;却忘了delete它&#xff0c;则是造成内存泄露的主要原因之一 例子一&#xff1a; void foo() {XXXObject* xo new XXXObject;if(!xo->DoSomethin…...

服务流控(Sentinel)

引入依赖 <!-- 必须的 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency><!-- sentinel 核心库 --> <dependency><groupId>com.ali…...