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

NIO入门

IO和NIO的区别:

  1. IO:通过流处理数据,仅支持阻塞IO。
    核心组件:InputStream /OutputStream用于字节的读写,Reader / Writer:用于字符流的读写。读取过程中无法被中断,是阻塞式IO。
  2. NIO:通过管道处理数据,支持阻塞IO和非阻塞IO。
    核心组件:Channel通道、Buffer缓冲区、Selector选择器。Channel与Buffer做直接交互,用于数据的传输,支持非阻塞IO,Buffer用于存放数据,Selector用于管理多个管道,允许单个线程处理多个IO。


NIO三大核心组件

NIO由三大核心组件分别是:Channel管道、Buffer缓冲区、Selector选择器。

Channel

  • 作用:替代传统I/O中的流(Stream),支持双向数据传输(读/写),直接与缓冲区(Buffer)交互。

  • 特点

    • 非阻塞模式(可通过configureBlocking(false)设置)。

    • 操作基于缓冲区,效率更高。

  • 常见实现类

    • FileChannel:文件I/O。

    • SocketChannel / ServerSocketChannel:TCP网络通信。

    • DatagramChannel:UDP网络通信。

Buffer

  • 作用:临时存储数据的容器,是Channel读写数据的直接目标。

  • 核心属性

    • capacity:最大容量。

    • position:当前操作位置。

    • limit:可操作数据的上限。

    • mark:标记位置(用于reset())。

  • 常见类型

    • ByteBuffer(最常用)、CharBufferIntBuffer等。

  • 关键操作

    • put()/get():读写数据。

    • flip():切换为读模式。

    • clear()/compact():清空或压缩缓冲区。

Selector

  • 作用:监听多个Channel的事件(如连接就绪、读就绪、写就绪),实现单线程管理多通道的高并发I/O。

  • 核心机制

    • 基于事件驱动的SelectionKey(包含事件类型和对应的Channel)。

    • 底层依赖操作系统的epoll(Linux)或kqueue(Mac)等系统调用。

  • 使用步骤

    1. 创建Selector:Selector.open()

    2. 将Channel注册到Selector,指定监听事件(如SelectionKey.OP_READ)。

    3. 调用select()方法阻塞等待就绪事件。

    4. 通过selectedKeys()处理就绪的Channel。

 Selector 的 4 种监听事件

事件说明适用 Channel
SelectionKey.OP_ACCEPT服务端接收新连接ServerSocketChannel
SelectionKey.OP_CONNECT客户端连接完成SocketChannel
SelectionKey.OP_READ数据可读SocketChannel / DatagramChannel
SelectionKey.OP_WRITE数据可写SocketChannel / DatagramChannel

Channel与Buffer联调

阻塞IO案例

ServerSocketChannel.accept():该方法用于等待客户端连接,直到有客户端连接才会返回,如果没有客户端连接则会一直阻塞。

SocketChannel.read(ByteBuffer):改方法用于接收客户端的数据,直到有数据才会返回,否则将一直阻塞线程。

    package com.jiawa.netty.server;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.util.List;import static com.jiawa.netty.utils.ByteBufferUtil.debugAll;public class Server {private static final Logger logger = LoggerFactory.getLogger(Server.class);public static void main(String[] args) throws IOException {//创建缓存、缓存客户端信息ByteBuffer buffer = ByteBuffer.allocate(16);//创建服务器ServerSocketChannel server = ServerSocketChannel.open();//绑定端口server.bind(new InetSocketAddress(8080));//创建客户端存储集合List<SocketChannel> clients = new java.util.ArrayList<>();//接收客户端while (true) {//阻塞线程,直到有客户端请求连接后释放SocketChannel client = server.accept();//如果有客户端请求,则返回客户端信息logger.info("收到客户端请求:{}", client);clients.add(client);for (SocketChannel c : clients) {//读取客户端数据int read = c.read(buffer);if (read > 0) {logger.info("读取客户端数据:{}", read);//打开读buffer.flip();//打印数据debugAll(buffer);//清空buffer.clear();}}}}}

非阻塞IO案例

server.configureBlocking(false):将 ServerSocketChannel 设置为非阻塞模式。

client.configureBlocking(false):将每个 SocketChannel 设置为非阻塞模式。

设置为非阻塞之后,则不会阻塞线程,不管是否有客户端连接或者接收客户端数据,都会直接返回,不会阻塞线程。

package com.jiawa.netty.server;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.List;import static com.jiawa.netty.utils.ByteBufferUtil.debugAll;public class Server {private static final Logger logger = LoggerFactory.getLogger(Server.class);public static void main(String[] args) throws IOException {//创建缓存、缓存客户端信息ByteBuffer buffer = ByteBuffer.allocate(16);//创建服务器ServerSocketChannel server = ServerSocketChannel.open();//非阻塞if (server!= null){server.configureBlocking(false);}//绑定端口server.bind(new InetSocketAddress(8080));//创建客户端存储集合List<SocketChannel> clients = new java.util.ArrayList<>();//接收客户端while (true) {//阻塞线程,直到有客户端请求连接后释放SocketChannel client = server.accept();//将客户端设置为非阻塞if (client != null) {client.configureBlocking(false);}//如果有客户端请求,则返回客户端信息if (client != null) {logger.info("收到客户端请求:{}", client);clients.add(client);}for (SocketChannel c : clients) {//读取客户端数据int read = c.read(buffer);if (read > 0){logger.info("读取客户端数据:{}", read);//打开读buffer.flip();//打印数据debugAll(buffer);//清空buffer.clear();}}}}
}

Channel、Buffer、Selector案例

package com.example.demo.server;import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;public class NioServer {public static void main(String[] args) throws IOException {// 创建一个Selector对象,用于管理多个通道的事件Selector selector = Selector.open();// 创建一个ServerSocketChannel对象,用于监听客户端连接请求ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();// 绑定服务器套接字到本地地址和端口8080serverSocketChannel.bind(new InetSocketAddress(8080));// 设置ServerSocketChannel为非阻塞模式serverSocketChannel.configureBlocking(false);// 将ServerSocketChannel注册到Selector上,并监听ACCEPT事件serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);System.out.println("服务器启动,等待客户端连接...");// 无限循环,持续处理客户端连接和数据读取while (true) {// 阻塞等待感兴趣的事件发生(如新的连接或可读的数据)int readyChannels = selector.select();// 如果没有准备好的通道,则继续下一次循环if (readyChannels == 0) continue;// 获取所有准备就绪的SelectionKey迭代器Iterator<SelectionKey> keyIterator = selector.selectedKeys().iterator();// 遍历所有准备就绪的SelectionKeywhile (keyIterator.hasNext()) {SelectionKey key = keyIterator.next();// 检查是否是新的连接请求if (key.isAcceptable()) {// 处理新的连接请求ServerSocketChannel ssc = (ServerSocketChannel) key.channel();// 接受新的客户端连接SocketChannel sc = ssc.accept();// 设置新连接的SocketChannel为非阻塞模式sc.configureBlocking(false);// 将新连接的SocketChannel注册到Selector上,并监听READ事件sc.register(selector, SelectionKey.OP_READ);System.out.println("新的客户端已连接"); // 打印连接信息} else if (key.isReadable()) {// 处理可读事件SocketChannel sc = (SocketChannel) key.channel();// 分配一个新的ByteBuffer,大小为1024字节ByteBuffer buffer = ByteBuffer.allocate(1024);// 从SocketChannel读取数据到ByteBuffer中int bytesRead = sc.read(buffer);// 如果读取到-1,表示客户端断开连接if (bytesRead == -1) {sc.close(); // 关闭SocketChannelSystem.out.println("客户端断开连接"); // 打印断开信息} else {// 切换ByteBuffer到读模式buffer.flip();// 读取ByteBuffer中的数据到byte数组byte[] bytes = new byte[buffer.remaining()];buffer.get(bytes);// 将byte数组转换为字符串String message = new String(bytes);System.out.println("收到消息: " + message); // 打印接收到的消息}}// 移除已经处理过的SelectionKeykeyIterator.remove();}}}
}

Channel常用方法:

1. 通用方法(所有Channel实现类共有)

方法说明
boolean isOpen()判断通道是否处于打开状态。
void close()关闭通道,释放资源(必须显式调用,否则可能泄漏资源)。
boolean isConnected()(仅Socket相关Channel)检查通道是否已连接。

2. 可读/可写操作

方法说明
int read(ByteBuffer dst)从通道读取数据到缓冲区,返回实际读取的字节数(非阻塞模式下可能返回0)。
int write(ByteBuffer src)将缓冲区数据写入通道,返回实际写入的字节数(非阻塞模式下可能返回0)。

3. 非阻塞模式控制

方法说明
void configureBlocking(boolean block)设置通道是否为阻塞模式(true为阻塞,false为非阻塞)。
boolean isBlocking()检查通道当前是否为阻塞模式。

4. 网络Channel特有方法(SocketChannel/ServerSocketChannel)

方法说明
SocketChannel bind(SocketAddress local)绑定通道到本地地址(用于服务端)。
SocketAddress getLocalAddress()获取绑定的本地地址。
SocketChannel connect(SocketAddress remote)连接到远程地址(客户端)。
boolean finishConnect()完成非阻塞连接(需配合connect()使用)。
SocketChannel accept()(仅ServerSocketChannel)接受客户端连接,返回一个新的SocketChannel

5. FileChannel特有方法

方法说明
long position()获取当前文件指针位置。
FileChannel position(long newPosition)设置文件指针位置。
long size()返回文件大小。
FileChannel truncate(long size)截断文件到指定大小。
int read(ByteBuffer dst, long position)从文件指定位置读取数据(不移动指针)。
int write(ByteBuffer src, long position)向文件指定位置写入数据(不移动指针)。
long transferTo(long position, long count, WritableByteChannel target)将数据从文件通道直接传输到目标通道(零拷贝优化)。
long transferFrom(ReadableByteChannel src, long position, long count)从源通道直接接收数据到文件通道(零拷贝优化)。
void force(boolean metaData)强制将数据刷到磁盘(确保写入持久化)。

6. DatagramChannel特有方法(UDP)

方法说明
DatagramChannel bind(SocketAddress local)绑定到本地端口。
SocketAddress receive(ByteBuffer dst)接收UDP数据包,返回发送方地址。
int send(ByteBuffer src, SocketAddress target)发送UDP数据包到目标地址。

Buffer常用方法

1. 核心属性相关方法

方法作用说明
int capacity()返回缓冲区容量创建后不可变
int position()返回当前操作位置下一个读写操作的索引
Buffer position(int newPosition)设置当前位置需满足 0 ≤ position ≤ limit
int limit()返回可操作数据上限缓冲区有效数据边界
Buffer limit(int newLimit)设置新的上限需满足 0 ≤ limit ≤ capacity
Buffer mark()标记当前位置配合reset()回溯
Buffer reset()恢复到标记位置未调用mark()会抛异常

2. 模式切换方法

方法作用说明
Buffer flip()写模式 → 读模式limit设为当前positionposition归零
Buffer clear()读模式 → 写模式position=0limit=capacity不清空数据
Buffer rewind()重置为读模式起点position=0limit不变(重复读)
boolean hasRemaining()检查剩余可操作数据return position < limit
int remaining()返回剩余可操作数据量return limit - position

3. 数据读写方法

通用方法(所有Buffer子类)
方法作用
T get()读取当前位置的数据并移动position
Buffer put(T value)写入数据到当前位置并移动position
T get(int index)读取指定位置数据(不移动position
Buffer put(int index, T value)写入数据到指定位置(不移动position
ByteBuffer特有方法
方法作用
byte[] array()返回底层字节数组(仅非直接缓冲区有效)
ByteBuffer put(byte[] src)批量写入字节数组
ByteBuffer get(byte[] dst)批量读取到字节数组
ByteBuffer slice()创建共享底层数据的新缓冲区(切片)
ByteBuffer duplicate()创建完全独立的副本缓冲区

4. 压缩与填充

方法作用典型场景
Buffer compact()压缩缓冲区将未读数据移到起始位置,position指向剩余空间
Buffer fill(byte value)(非标准API,需自行实现)填充固定值到缓冲区

5. 直接缓冲区控制(ByteBuffer特有)

方法作用
static ByteBuffer allocateDirect(int capacity)创建直接缓冲区(堆外内存)
boolean isDirect()判断是否为直接缓冲区

Selector 的常用方法

(1)Selector 的创建与关闭

方法说明
Selector.open()创建 Selector
boolean isOpen()检查 Selector 是否打开
void close()关闭 Selector(释放资源)

(2)Channel 的注册与注销

方法说明
channel.register(selector, ops)注册 Channel 到 Selector,并指定监听事件
key.cancel()取消 Channel 的注册(不会立即注销,需调用 select() 后生效)

(3)事件监听

方法说明
int select()阻塞等待至少一个事件就绪(返回就绪的 Channel 数量)
int select(long timeout)带超时的阻塞等待
int selectNow()非阻塞检查(立即返回)
Set<SelectionKey> selectedKeys()获取所有就绪的事件(需手动处理并移除)
Set<SelectionKey> keys()获取所有已注册的 Channel(包括未就绪的)

相关文章:

NIO入门

IO和NIO的区别&#xff1a; IO&#xff1a;通过流处理数据&#xff0c;仅支持阻塞IO。 核心组件&#xff1a;InputStream /OutputStream用于字节的读写&#xff0c;Reader / Writer&#xff1a;用于字符流的读写。读取过程中无法被中断&#xff0c;是阻塞式IO。 NIO:通过管道处…...

leetcode 用队列模拟栈

这个其实只需要一个队列就可以的&#xff0c;但是我这里用的是2个队列进行替换&#xff0c; 先转n-1个到空的队列&#xff0c; 然后在此基础上进行队列的互换&#xff0c;把剩下的那一个元素所在的队列进行poleft操作就可以了。 class MyStack:def __init__(self):self.q1_i…...

spring security 使用的过滤器还是拦截器

spring security 使用的过滤器还是拦截器 Spring Security 是一个强大的安全框架&#xff0c;用于保护 Java 应用程序。它主要使用过滤器&#xff08;Filters&#xff09;来实现安全功能&#xff0c;而不是拦截器&#xff08;Interceptors&#xff09;。不过&#xff0c;它也提…...

大疆上云api介绍

概述 目前对于 DJI 无人机接入第三方云平台,主要是基于 MSDK 开发定制 App,然后自己定义私有上云通信协议连接到云平台中。这样对于核心业务是开发云平台,无人机只是其中一个接入硬件设备的开发者来说,重新基于 MSDK 开发 App 工作量大、成本高,同时还需要花很多精力在无人…...

2025-03-25 Unity 网络基础4——TCP同步通信

文章目录 1 Socket1.1 Socket 类型1.2 构造 Socket1.3 常用属性1.4 常用方法 2 TCP 通信2.1 服务端配置2.2 客户端配置2.3 进行通信2.4 多设备通信 3 区分消息 1 Socket ​ Socket 是 C# 提供的网络通信类&#xff08;其它语言也有对应的 Socket 类&#xff09;&#xff0c;是…...

C++进阶(一)

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 前言 本篇博客是讲解函数的重载以及引用的知识点的。 文章目录 前言 1.函数重载 1.1何为函数重载 1.2函数重载的作用 1.3函数重载的实现 2.引用 2.1何为引用 2.2定义引用 2.3引用特性 2.4常引用 2…...

深度解读DeepSeek:开源周(Open Source Week)技术解读

深度解读DeepSeek&#xff1a;开源周&#xff08;Open Source Week&#xff09;技术解读 深度解读DeepSeek&#xff1a;源码解读 DeepSeek-V3 深度解读DeepSeek&#xff1a;技术原理 深度解读DeepSeek&#xff1a;发展历程 文章目录 一、开源内容概览Day1&#xff1a;FlashMLAD…...

AI Agent开发与应用

AI Agent开发与应用&#xff1a;本地化智能体实践——本地化智能体开发进展与主流框架分析 我要说的都在ppt里面了&#xff0c;相关复现工作请参考ai agent开发实例 OpenManus Dify Owl 第二个版本更新了对话的框架&#xff0c;通过gradio做了一个全新的界面 只测试了阿里云…...

石斛基因组-文献精读122

A chromosome-level Dendrobium moniliforme genome assembly reveals the regulatory mechanisms of flavonoid and carotenoid biosynthesis pathways 《染色体水平的石斛基因组组装揭示了黄酮类和胡萝卜素生物合成途径的调控机制》 摘要 石斛&#xff08;Dendrobium monil…...

javaSE.多维数组

1 final 引用类型 final int[] arr 继承Object 的引用类型&#xff0c;不能改变引用的对象 存的其实是引用 数组类型数组&#xff0c;其实存的是引用 int [][] arr new int[][] { {1,2,3}, {4,5,6} };int [] a arr[0]; int [] b arr[1];...

Spring IOC容器详解:深入理解控制反转与依赖注入

一、什么是IOC&#xff1f; 在java当中一个类想要使用另一个类的方法&#xff0c;就必须在这个类当中创建这个类的对象&#xff0c;那么可能会出现如下情况&#xff0c; 比如A类当中创建着B对象&#xff0c;B类当中有C对象&#xff0c;C类当中有A对象&#xff0c;这个如果一个类…...

Python条件处理,新手入门到精通

Python条件处理&#xff0c;新手入门到精通 对话实录 **小白**&#xff1a;&#xff08;崩溃&#xff09;我写了if x 1:&#xff0c;为什么Python会报错&#xff1f; **专家**&#xff1a;&#xff08;推眼镜&#xff09;**是赋值&#xff0c;才是比较**&#xff01;想判断相…...

JPA实体类注解缺失异常全解:从报错到防御!!!

&#x1f6a8; JPA实体类注解缺失异常全解&#xff1a;从报错到防御 &#x1f6e1;️ 一、&#x1f4a5; 问题现象速览 // 经典报错示例 Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.example.entity.Product典型症状&#xff1a; &…...

Spring 源码硬核解析系列专题(三十二):Spring Cloud LoadBalancer 的负载均衡源码解析

在前几期中,我们从 Spring 核心到 Spring Boot 的多个模块,再到 Spring Cloud Alibaba,逐步揭示了 Spring 生态在微服务领域的广泛应用。Spring Cloud LoadBalancer 是 Spring Cloud 提供的客户端负载均衡组件,替代 Ribbon,支持服务发现和负载均衡策略。本篇将深入 Spring…...

生成式媒介革命已至,搜索如何借力DeepSeek破局?

作为前沿AI技术的代表&#xff0c;DeepSeek不仅突破了传统大模型的算力瓶颈&#xff0c;更以“高性能低成本开源生态”的特性&#xff0c;重塑传播生态。对于搜索行业从业者而言&#xff0c;这场技术变革既是机遇&#xff0c;也是挑战。 DeepSeek的三大“杀手锏”&#xff0c;…...

【Vue3入门1】02- Vue3的基本操作(上)

本文介绍vue3中的一些方法的操作。 目录 1. 绑定事件 v-on 2. 按键修饰符 3. 显示和隐藏 v-show 4. 条件渲染 v-if 5. 条件渲染if-else 1. 绑定事件 v-on 点击事件 v-on:click" 发生事件 " <body><div id"app">{{ msg }} <h2&g…...

【C语言】多进程/多线程

【C语言】多进程/多线程 参考链接多进程/多线程服务器1. 多进程服务器2. 多线程服务器 结语参考链接 参考链接 c 中文网 菜鸟 c 多进程/多线程服务器 多进程和多线程是常用的并发编程技术。它们都允许程序同时执行多个任务&#xff0c;提高了系统的资源利用率和程序的运行效率…...

模糊数学 | 模型 / 集合 / 关系 / 矩阵

注&#xff1a;本文为来自 “模糊数学 | 模型及其应用” 相关文章合辑。 略作重排。 如有内容异常&#xff0c;请看原文。 模糊数学模型&#xff1a;隶属函数、模糊集合的表示方法、模糊关系、模糊矩阵 wamg 潇潇 于 2019-05-06 22:35:21 发布 1.1 模糊数学简介 1965 年&a…...

Browserlist 使用指南:应对浏览器兼容性问题的解决方案

前言 在前端开发中&#xff0c;我们经常需要处理各种不同的浏览器兼容性问题。每个浏览器的版本众多&#xff0c;处理这些问题可能会让人感到头疼。幸运的是&#xff0c;有一个名为 Browserlist 的工具可以大大简化这项工作。本文将介绍 Browserlist 的作用和使用方法&#xf…...

QinQ项展 VLAN 空间

随着以太网技术在网络中的大量部署&#xff0c;利用 VLAN 对用户进行隔离和标识受到很大限制。因为 IEEE802.1Q 中定义的 VLAN Tag 域只有 12 个比特&#xff0c;仅能表示 4096 个 VLAN&#xff0c;无法满足城域以太网中标识大量用户的需求&#xff0c;于是 QinQ 技术应运而生。…...

数据结构—树(java实现)

目录 一、树的基本概念1.树的术语2.常见的树结构 二、节点的定义三、有关树结构的操作1.按照数组构造平衡 二叉搜索树2.层序遍历树3.前、中、后序遍历树(1).前序遍历树(2).中序遍历树(3).后序遍历树(4).各种遍历的情况的效果对比 4.元素添加5.元素删除1.删除叶子节点2.删除单一…...

Unity射击游戏手榴弹笔记

数据 在物品系统增加一个新的物品类&#xff0c;手榴弹类&#xff0c;定义手榴弹依附物体的类、配表数据类、背包内物品数据类、新建配表、在背包增加手榴弹数组&#xff1b;手榴弹的预制体需要可拾取的、扔出的&#xff1b;背包界面增加背包内的手榴弹、场景里的手榴弹、别人…...

S32K144外设实验(七):FTM输出多路互补带死区PWM

文章目录 1. 概述1.1 时钟系统1.2 实验目的2. 代码的配置2.1 时钟配置2.2 FTM模块配置2.3 输出引脚配置2.4 API函数调用1. 概述 互补对的PWM输出是很重要的外设功能,尤其应用再无刷电机的控制。 1.1 时钟系统 笔者再墨迹一遍时钟的设置,因为很重要。 FTM的CPU接口时钟为SY…...

SingleMod

SingleMod SingleMod是一种深度学习模型,专为利用纳米孔直接RNA测序(DRS)数据在单RNA分子中精确检测m6A修饰而设计。该模型通过深度多实例回归框架进行训练,能够充分利用广泛的甲基化率标签。SingleMod是一个通用框架,可轻松适配其他核酸修饰的检测模型训练。 注意: Si…...

[网鼎杯 2020 白虎组]PicDown1 [反弹shell] [敏感文件路径] [文件描述符]

常见读取路径 /etc/passwd一些用户和权限还有一些乱七八糟的 /proc/self/cmdline包含用于开始当前进程的命令 /proc/self/cwd/app.py当前工作目录的app.py /proc/self/environ包含了可用进程的环境变量 /proc/pid/exe 包含了正在进程中运行的程序链接&#xff1b; /proc/pid…...

单纯形法之大M法

1. 问题背景与标准化 在求解某些线性规划问题时&#xff0c;往往难以直接找到初始的基本可行解。特别是当约束中存在等式或 “≥” 类型的不等式时&#xff0c;我们需要引入人工变量来构造一个初始可行解。 考虑如下标准形式问题&#xff08;假设为最大化问题&#xff09;&am…...

各类神经网络学习:(四)RNN 循环神经网络(下集),pytorch 版的 RNN 代码编写

上一篇下一篇RNN&#xff08;中集&#xff09;待编写 代码详解 pytorch 官网主要有两个可调用的模块&#xff0c;分别是 nn.RNNCell 和 nn.RNN &#xff0c;下面会进行详细讲解。 RNN 的同步多对多、多对一、一对多等等结构都是由这两个模块实现的&#xff0c;只需要将对输入…...

DeepSeek 发布DeepSeek-V3-0324 版本 前端与网页开发能力、推理与多任务能力提升

DeepSeek 发布 DeepSeek-V3-0324 版本 DeepSeek 发布 DeepSeek-V3-0324 版本&#xff0c;在其前代模型 DeepSeek-V3 的基础上进行了显著升级。 该模型专注于中文和多语言文本生成、推理、代码编写等综合能力的提升&#xff0c;支持 Function Calling&#xff08;函数调用&…...

航班时间 | 第九届蓝桥杯省赛C++A组

小 h 前往美国参加了蓝桥杯国际赛。 小 h 的女朋友发现小 h 上午十点出发&#xff0c;上午十二点到达美国&#xff0c;于是感叹到“现在飞机飞得真快&#xff0c;两小时就能到美国了”。 小 hh 对超音速飞行感到十分恐惧。 仔细观察后发现飞机的起降时间都是当地时间。 由于…...

传输层安全协议 SSL/TLS 详细介绍

传输层安全性协议TLS及其前身安全套接层SSL是一种安全传输协议&#xff0c;目前TLS协议已成为互联网上保密通信的工业标准&#xff0c;在浏览器、邮箱、即时通信、VoIP等应用程序中得到广泛的应用。本文对SSL和TLS协议进行一个详细的介绍&#xff0c;以便于大家更直观的理解和认…...