Java入门(7)--网络编程
Java网络编程:构建网络应用的基石 🌐
🎯 掌握Java网络编程,打造强大的网络应用!
在上一篇文章中,我们探讨了Java的I/O操作和反射机制。今天,让我们深入学习Java网络编程,了解如何构建网络应用程序! 💻
1. 网络编程基础 📡
Java提供了强大的网络编程API,支持各种网络协议和通信模式。让我们从基础概念开始学习。
1.1 网络基础概念
- IP地址:网络设备的唯一标识
- 端口号:应用程序的通信端点
- 协议:通信规则(如TCP、UDP)
- Socket:网络通信的端点
public class NetworkBasics {public static void main(String[] args) throws Exception {// 获取本机IP地址InetAddress localHost = InetAddress.getLocalHost();System.out.println("本机IP地址:" + localHost.getHostAddress());// 解析域名InetAddress github = InetAddress.getByName("github.com");System.out.println("GitHub IP地址:" + github.getHostAddress());// 检查主机可达性boolean reachable = github.isReachable(5000);System.out.println("GitHub是否可达:" + reachable);}
}
1.2 URL处理
public class URLExample {public static void main(String[] args) {try {URL url = new URL("https://api.github.com/users/octocat");// 获取URL信息System.out.println("协议:" + url.getProtocol());System.out.println("主机:" + url.getHost());System.out.println("端口:" + url.getPort());System.out.println("路径:" + url.getPath());// 读取URL内容try (BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}}} catch (IOException e) {System.out.println("URL处理错误:" + e.getMessage());}}
}
2. Socket编程 🔌
Socket是网络编程的核心,让我们通过实例来学习TCP和UDP通信。
2.1 TCP通信示例
服务器端代码:
public class TCPServer {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8888)) {System.out.println("服务器启动,等待连接...");while (true) {Socket clientSocket = serverSocket.accept();System.out.println("客户端已连接:" + clientSocket.getInetAddress());// 处理客户端请求new Thread(() -> handleClient(clientSocket)).start();}} catch (IOException e) {System.out.println("服务器错误:" + e.getMessage());}}private static void handleClient(Socket clientSocket) {try (BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(), true)) {String message;while ((message = reader.readLine()) != null) {System.out.println("收到消息:" + message);writer.println("服务器收到:" + message);}} catch (IOException e) {System.out.println("客户端处理错误:" + e.getMessage());}}
}
客户端代码:
public class TCPClient {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 8888);BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in))) {System.out.println("已连接到服务器");String message;while ((message = consoleReader.readLine()) != null) {writer.println(message);System.out.println("服务器响应:" + reader.readLine());}} catch (IOException e) {System.out.println("客户端错误:" + e.getMessage());}}
}
2.2 UDP通信示例
服务器端代码:
public class UDPServer {public static void main(String[] args) {try (DatagramSocket socket = new DatagramSocket(9999)) {System.out.println("UDP服务器启动...");byte[] buffer = new byte[1024];while (true) {DatagramPacket packet = new DatagramPacket(buffer, buffer.length);socket.receive(packet);String message = new String(packet.getData(), 0, packet.getLength());System.out.println("收到消息:" + message);// 发送响应String response = "服务器收到:" + message;byte[] responseData = response.getBytes();DatagramPacket responsePacket = new DatagramPacket(responseData,responseData.length,packet.getAddress(),packet.getPort());socket.send(responsePacket);}} catch (IOException e) {System.out.println("服务器错误:" + e.getMessage());}}
}
客户端代码:
public class UDPClient {public static void main(String[] args) {try (DatagramSocket socket = new DatagramSocket()) {InetAddress serverAddress = InetAddress.getByName("localhost");BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));while (true) {System.out.print("请输入消息:");String message = consoleReader.readLine();// 发送数据byte[] sendData = message.getBytes();DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,serverAddress,9999);socket.send(sendPacket);// 接收响应byte[] receiveData = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);socket.receive(receivePacket);String response = new String(receivePacket.getData(),0,receivePacket.getLength());System.out.println("服务器响应:" + response);}} catch (IOException e) {System.out.println("客户端错误:" + e.getMessage());}}
}
3. HTTP编程 🌍
3.1 HttpURLConnection示例
public class HttpExample {public static void main(String[] args) {try {URL url = new URL("https://api.github.com/users/octocat");HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 设置请求方法和头部conn.setRequestMethod("GET");conn.setRequestProperty("Accept", "application/json");// 获取响应码int responseCode = conn.getResponseCode();System.out.println("响应码:" + responseCode);// 读取响应内容try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}System.out.println("响应内容:" + response.toString());}} catch (IOException e) {System.out.println("HTTP请求错误:" + e.getMessage());}}
}
3.2 实用工具类
public class HttpClient {private static final int TIMEOUT = 5000;public static String get(String url) throws IOException {HttpURLConnection conn = null;try {URL urlObj = new URL(url);conn = (HttpURLConnection) urlObj.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(TIMEOUT);conn.setReadTimeout(TIMEOUT);try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}return response.toString();}} finally {if (conn != null) {conn.disconnect();}}}public static String post(String url, String body) throws IOException {HttpURLConnection conn = null;try {URL urlObj = new URL(url);conn = (HttpURLConnection) urlObj.openConnection();conn.setRequestMethod("POST");conn.setConnectTimeout(TIMEOUT);conn.setReadTimeout(TIMEOUT);conn.setDoOutput(true);// 写入请求体try (OutputStream os = conn.getOutputStream()) {byte[] input = body.getBytes(StandardCharsets.UTF_8);os.write(input, 0, input.length);}// 读取响应try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}return response.toString();}} finally {if (conn != null) {conn.disconnect();}}}
}
4. 网络编程最佳实践 💡
-
连接管理:
- 及时关闭网络连接
- 使用连接池管理连接
- 设置合适的超时时间
- 处理断线重连
-
性能优化:
- 使用NIO提升性能
- 实现多线程处理
- 使用缓冲区优化数据传输
- 压缩传输数据
-
安全建议:
- 使用SSL/TLS加密通信
- 验证网络连接的合法性
- 防止拒绝服务攻击
- 保护敏感数据
5. 高级网络编程特性 🚀
5.1 NIO编程模型
NIO(New I/O)提供了更高效的网络编程模型,特别适合处理大量连接的场景。
public class NIOServer {public static void main(String[] args) throws IOException {// 创建选择器Selector selector = Selector.open();// 创建ServerSocketChannelServerSocketChannel serverSocket = ServerSocketChannel.open();serverSocket.bind(new InetSocketAddress(8889));serverSocket.configureBlocking(false);// 注册到选择器serverSocket.register(selector, SelectionKey.OP_ACCEPT);System.out.println("NIO服务器启动在端口8889...");while (true) {selector.select();Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> iter = selectedKeys.iterator();while (iter.hasNext()) {SelectionKey key = iter.next();if (key.isAcceptable()) {handleAccept(serverSocket, selector);}if (key.isReadable()) {handleRead(key);}iter.remove();}}}private static void handleAccept(ServerSocketChannel serverSocket, Selector selector) throws IOException {SocketChannel client = serverSocket.accept();client.configureBlocking(false);client.register(selector, SelectionKey.OP_READ);System.out.println("接受新的连接:" + client.getRemoteAddress());}private static void handleRead(SelectionKey key) throws IOException {SocketChannel client = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(1024);int bytesRead = client.read(buffer);if (bytesRead == -1) {client.close();return;}buffer.flip();byte[] data = new byte[buffer.limit()];buffer.get(data);System.out.println("收到消息:" + new String(data));}
}
5.2 异步网络编程
Java 7引入的AIO(Asynchronous I/O)提供了真正的异步非阻塞I/O操作。
public class AsyncServer {public static void main(String[] args) throws IOException {AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open();server.bind(new InetSocketAddress(8890));server.accept(null, new CompletionHandler<AsynchronousSocketChannel,Void>() {@Overridepublic void completed(AsynchronousSocketChannel client, Void att) {// 继续接受下一个连接server.accept(null, this);ByteBuffer buffer = ByteBuffer.allocate(1024);client.read(buffer, buffer, new CompletionHandler<Integer,ByteBuffer>() {@Overridepublic void completed(Integer result, ByteBuffer attachment) {attachment.flip();byte[] data = new byte[attachment.limit()];attachment.get(data);System.out.println("异步收到:" + new String(data));}@Overridepublic void failed(Throwable exc, ByteBuffer attachment) {exc.printStackTrace();}});}@Overridepublic void failed(Throwable exc, Void att) {exc.printStackTrace();}});System.out.println("异步服务器启动在端口8890...");// 保持主线程运行System.in.read();}
}
6. 网络安全编程 🔒
6.1 SSL/TLS实现
安全套接字层(SSL)和传输层安全(TLS)是网络通信加密的标准。
public class SSLServer {public static void main(String[] args) {try {// 加载密钥库String keystorePath = "server.keystore";char[] keystorePass = "password".toCharArray();KeyStore ks = KeyStore.getInstance("JKS");ks.load(new FileInputStream(keystorePath), keystorePass);// 初始化密钥管理器KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");kmf.init(ks, keystorePass);// 配置SSL上下文SSLContext sslContext = SSLContext.getInstance("TLS");sslContext.init(kmf.getKeyManagers(), null, null);// 创建SSL服务器套接字SSLServerSocketFactory ssf = sslContext.getServerSocketFactory();SSLServerSocket serverSocket = (SSLServerSocket) ssf.createServerSocket(8891);System.out.println("SSL服务器启动在端口8891...");while (true) {SSLSocket client = (SSLSocket) serverSocket.accept();handleSecureClient(client);}} catch (Exception e) {System.out.println("SSL服务器错误:" + e.getMessage());}}
}
6.2 实用工具类:安全数据传输
public class SecureNetworkUtils {// AES加密配置private static final String ALGORITHM = "AES";private static final int KEY_SIZE = 256;private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";/*** 生成AES密钥*/public static SecretKey generateKey() throws NoSuchAlgorithmException {KeyGenerator keyGen = KeyGenerator.getInstance(ALGORITHM);keyGen.init(KEY_SIZE);return keyGen.generateKey();}/*** 加密数据*/public static byte[] encrypt(String data, SecretKey key, IvParameterSpec iv) throws Exception {Cipher cipher = Cipher.getInstance(TRANSFORMATION);cipher.init(Cipher.ENCRYPT_MODE, key, iv);return cipher.doFinal(data.getBytes());}/*** 解密数据*/public static String decrypt(byte[] encryptedData, SecretKey key, IvParameterSpec iv) throws Exception {Cipher cipher = Cipher.getInstance(TRANSFORMATION);cipher.init(Cipher.DECRYPT_MODE, key, iv);byte[] decryptedData = cipher.doFinal(encryptedData);return new String(decryptedData);}
}
7. 网络编程设计模式 🎨
7.1 Reactor模式
public class Reactor implements Runnable {final Selector selector;final ServerSocketChannel serverSocket;Reactor(int port) throws IOException {selector = Selector.open();serverSocket = ServerSocketChannel.open();serverSocket.socket().bind(new InetSocketAddress(port));serverSocket.configureBlocking(false);SelectionKey sk = serverSocket.register(selector, SelectionKey.OP_ACCEPT);sk.attach(new Acceptor());}public void run() {try {while (!Thread.interrupted()) {selector.select();Set<SelectionKey> selected = selector.selectedKeys();Iterator<SelectionKey> it = selected.iterator();while (it.hasNext()) {dispatch(it.next());it.remove();}}} catch (IOException ex) {ex.printStackTrace();}}void dispatch(SelectionKey k) {Runnable r = (Runnable) (k.attachment());if (r != null) {r.run();}}
}
7.2 观察者模式在网络编程中的应用
public interface NetworkEventListener {void onConnected(String clientId);void onMessageReceived(String clientId, String message);void onDisconnected(String clientId);
}public class NetworkEventManager {private List<NetworkEventListener> listeners = new ArrayList<>();public void addListener(NetworkEventListener listener) {listeners.add(listener);}public void removeListener(NetworkEventListener listener) {listeners.remove(listener);}protected void fireOnConnected(String clientId) {for (NetworkEventListener listener : listeners) {listener.onConnected(clientId);}}// ... 其他事件触发方法
}
8. 性能优化技巧 🚀
8.1 网络性能调优
- 缓冲区优化
// 使用直接缓冲区
ByteBuffer buffer = ByteBuffer.allocateDirect(65536);// 使用合适的缓冲区大小
int bufferSize = socket.getReceiveBufferSize();
- 连接池管理
public class ConnectionPool {private static final int MAX_POOL_SIZE = 20;private Queue<Socket> pool = new ConcurrentLinkedQueue<>();public Socket acquire() {Socket socket = pool.poll();if (socket == null || socket.isClosed()) {socket = createNewConnection();}return socket;}public void release(Socket socket) {if (pool.size() < MAX_POOL_SIZE) {pool.offer(socket);} else {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}
}
9. 实战示例:高性能聊天服务器 💬
public class ChatServer {private static final int PORT = 8892;private final Map<String, SocketChannel> clients = new ConcurrentHashMap<>();private final Selector selector;public ChatServer() throws IOException {this.selector = Selector.open();ServerSocketChannel serverSocket = ServerSocketChannel.open();serverSocket.bind(new InetSocketAddress(PORT));serverSocket.configureBlocking(false);serverSocket.register(selector, SelectionKey.OP_ACCEPT);}public void start() {try {System.out.println("聊天服务器启动在端口 " + PORT);while (true) {selector.select();Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> iter = selectedKeys.iterator();while (iter.hasNext()) {SelectionKey key = iter.next();if (key.isAcceptable()) {handleNewConnection();}if (key.isReadable()) {handleMessage(key);}iter.remove();}}} catch (IOException e) {e.printStackTrace();}}// ... 实现详细的处理方法
}
10. 写在最后 📝
咱们深入探讨了Java网络编程的高级特性和最佳实践,从基础的Socket编程到高级的NIO和安全编程,为构建强大的网络应用提供了全面的指导。
在未来的网络编程发展中,我们可以期待:
- 更高效的异步编程模型
- 更简单的响应式编程API
- 更强大的安全机制
- 更完善的云原生支持
学习资源推荐
- Java Network Programming, 4th Edition (O’Reilly)
- Netty in Action
- Java NIO (Ron Hitchens)
练习项目建议
- 实现一个支持多人的聊天室
- 开发一个简单的HTTP服务器
- 构建一个文件传输系统
- 设计一个基于WebSocket的实时通讯应用
记住:优秀的网络程序不仅要能正常工作,还要考虑性能、安全性和可维护性。持续学习和实践是提升网络编程能力的关键!
如果你觉得这篇文章有帮助,欢迎点赞转发,也期待在评论区看到你的想法和建议!👇
咱们下期见 !
相关文章:
Java入门(7)--网络编程
Java网络编程:构建网络应用的基石 🌐 🎯 掌握Java网络编程,打造强大的网络应用! 在上一篇文章中,我们探讨了Java的I/O操作和反射机制。今天,让我们深入学习Java网络编程,了解如何构建…...
[思考记录]思维局限,以为懂了
最近配合整理一些内容,找到较早期的某些产品设计资料在翻阅回顾。在这次回顾过程中,发现当时自己的理解存在很多局限。 以资源体系的设计为例,那时自认为已经“懂了”,对相关的概念、作用关系、组成及实现等都有一定的了解&#x…...
力扣题目解析--最长公共前缀
题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入:strs ["flower","flow","flight"] 输出:"fl"示例 2ÿ…...
不画饼——研究生学习和赚钱的平衡点
在现代社会中,年轻人面临着学习和赚钱之间的矛盾。尤其是在经济压力日益增大的背景下,如何在这两者之间找到合适的平衡点,成为了许多学生和职场新人面临的重要问题。本文将探讨在何种情况下应该听从老师的建议,专注于学习…...

华为实时视频使用FLV播放RTSP流
import flvjs from ‘flv.js’; 安装flv <video style"width:100%;height:100%;" ref"videoHWRef" ></video>// src 华为rtsp流 rtsp://admin:Huaweivideo10.10.8.151:554/xxx/trackID1// url 需要后端提供视频源地址playVideo() {if (fl…...

JAVA设计模式之【建造者模式】
1 定义 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 2 类图 产品类(Product):表示被创建的复杂…...

【jvm】为什么Xms和Xmx的值通常设置为相同的?
目录 1. 说明2. 避免性能开销3. 提升稳定性4. 简化配置5. 优化垃圾收集6. 获取参数6.1 代码示例6.2 结果示例 1. 说明 1.-Xms 和 -Xmx 参数分别用于设置堆内存的初始大小(最小值)和最大大小。2.在开发环境中,开发人员可能希望快速启动应用程…...
windows查看net网络监听端口命令和工具(ipconfig、netstat、tasklist、TCPView)
文章目录 使用命令提示符(CMD)查看网络连接和配置使用 netstat 命令查看监听端口查看特定的端口查看TCP监听端口tasklist查看对应进程ID的程序Get-NetTCPConnection 命令使用 TCPView工具使用命令提示符(CMD) 查看网络连接和配置 ipconfig :显示所有网络 适配器的当前 TC…...

JAVA-数据结构- 二叉搜索树
1.搜索树 前面我们已经使用C语言学习完了二叉树,懂得了一些二叉树的基本性质已经实现方法 https://mp.csdn.net/mp_blog/creation/editor/139572374,本文我们来一起进行二叉树的衍生-二叉搜索树 1.1 概念 二叉搜索树又称二叉排序树,它或者是…...
深入研究 RAG 流程中的关键组件
我们已经看到了整个RAG流程,并获得了第一手的实践经验,您可能会对RAG流程中一些组件的使用和目的存在很多疑惑,比如RunnablePassthrough。在本节中,我们将进一步了解这些关键组件。 RAG的核心模型思想是将一个复杂的任务分解为多…...
新手如何学习python并快速成为高手
英雄Python入门到精通链接:https://pan.quark.cn/s/57162ec366a9 学习Python作为新手,有以下几个步骤: 学习基本概念和语法:首先,你需要学习Python的基本概念和语法。可以通过在线教程、书籍或者视频教程来学习。了解…...

Linux历史命令history增加执行时间显示
Centos系统默认历史命令显示如下 为了更好的溯源,获取执行命令的准确时间,需要增加一些配置 设置环境变量 vim /etc/profile 在最下面添加以下环境配置 export HISTTIMEFORMAT"%Y-%m-%d %H:%M:%S " 立即刷新该环境变量 source /etc/pro…...

从 vue 源码看问题 — 你知道 Hook Event 吗?
前言 在之前的几篇文章中,都有提到 vue 中调用生命周期钩子时是通过 callHook() 方法进行调用的,比如在初始化篇章中调用 beforeCreate 和 created 生命周期钩子方式如下: 那么接下来一起来了解下到底什么是 Hook Event ? Hook Event 是什…...

信息安全工程师(68)可信计算技术与应用
前言 可信计算技术是一种计算机安全体系结构,旨在提高计算机系统在面临各种攻击和威胁时的安全性和保密性。 一、可信计算技术的定义与原理 可信计算技术通过包括硬件加密、受限访问以及计算机系统本身的完整性验证等技术手段,确保计算机系统在各种攻击和…...

每日OJ题_牛客_相差不超过k的最多数_滑动窗口_C++_Java
目录 牛客_相差不超过k的最多数_滑动窗口 题目解析 C代码 Java代码 牛客_相差不超过k的最多数_滑动窗口 相差不超过k的最多数_牛客题霸_牛客网 (nowcoder.com) 描述: 给定一个数组,选择一些数,要求选择的数中任意两数差的绝对值不超过 …...
来咯来咯webSocket
在项目总目录下 设置socketServe文件夹 里面创建下面两个文件 使用的时候需要开启 node webSocket.cjs var { Server } require(ws); var moment require(moment);const wss new Server({port: 8888 });let id 0; let onlineMemberList []; const defaultUser user;wss…...
Android CALL关于电话音频和紧急电话设置和获取
获取音频服务,设置音源类型:电话类型和获取最大电话音量,响铃模式 private AudioManager mAudioManager; mAudioManager (AudioManager) getSystemService(AUDIO_SERVICE); mAudioManager.setStreamVolume(AudioManager.STREAM_VOIC…...

【春秋云镜】CVE-2023-23752
目录 CVE-2023-23752漏洞细节漏洞利用示例修复建议 春秋云镜:解法一:解法二: CVE-2023-23752 是一个影响 Joomla CMS 的未授权路径遍历漏洞。该漏洞出现在 Joomla 4.0.0 至 4.2.7 版本中,允许未经认证的远程攻击者通过特定 API 端…...
C#-__DynamicallyInvokable
[__DynamicallyInvokable] 属性是用于 .NET Framework 中的特性之一。这个特性通常用于标记在动态语言运行时中可以进行调用的方法或属性。 当一个方法或属性被标记为 [__DynamicallyInvokable],它表明这个成员在动态语言的环境中是可调用的。换句话说,…...

2024年最新10款顶级项目管理软件排行
项目管理软件在现代项目管理中扮演着至关重要的角色,它不仅仅是一个工具,更是一种高效、系统化的方法来管理和优化项目流程,帮助项目经理和团队成员快速了解项目状态,加速项目进展。 进度猫 进度猫是一款以甘特图为向导的轻量级…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...

Qt的学习(一)
1.什么是Qt Qt特指用来进行桌面应用开发(电脑上写的程序)涉及到的一套技术Qt无法开发网页前端,也不能开发移动应用。 客户端开发的重要任务:编写和用户交互的界面。一般来说和用户交互的界面,有两种典型风格&…...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...