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

Java进阶14 TCP日志枚举

Java进阶14 TCP&日志&枚举

一、网络编程TCP

Java对基于TCP协议得网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。

1、TCP协议发数据
1.1 构造方法

方法

说明

Socket(InetAddress address,int port)

创建流套接字并将其连接到指定IP指定端口号

Socket(String host,int port)

创建流套接字并将其连接到指定主机上的指定端口号

1.2 相关方法

方法

说明

InputStream getInputStream()

返回此套接字的输入流

OutputStream getOutputStream()

返回此套接字的输出流

1.3 代码实现
public class Client {? ?public static void main(String[] args) throws IOException {? ? ? ?//创建客户端的Socket对象(Socket)? ? ? ?//Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号? ? ? ?Socket s = new Socket("127.0.0.1",10000);
?? ? ? ?//获取输出流,写数据? ? ? ?//OutputStream getOutputStream() 返回此套接字的输出流? ? ? ?OutputStream os = s.getOutputStream();? ? ? ?os.write("hello,tcp,我来了".getBytes());
?? ? ? ?//释放资源? ? ? ?os.close();? ? ? ?s.close();?  }
}
2、TCP协议收数据

Java为客户端提供了Socket类,为服务端提供了ServeSocket类

2.1 构造方法

方法

说明

ServerSocket(int port)

创建绑定到指定端口的服务器套接字

2.2 相关方法

方法

说明

Socket accept()

监听要连接到此的套接字并接受它

2.3 代码实现
public class Server {? ?public static void main(String[] args) throws IOException {? ? ? ?//创建服务器端的Socket对象(ServerSocket)? ? ? ?//ServerSocket(int port) 创建绑定到指定端口的服务器套接字? ? ? ?ServerSocket ss = new ServerSocket(10000);
?? ? ? ?//Socket accept() 侦听要连接到此套接字并接受它? ? ? ?Socket s = ss.accept();
?? ? ? ?//获取输入流,读数据,并把数据显示在控制台? ? ? ?InputStream is = s.getInputStream();? ? ? ?byte[] bys = new byte[1024];? ? ? ?int len = is.read(bys);? ? ? ?String data = new String(bys,0,len);? ? ? ?System.out.println("数据是:" + data);
?? ? ? ?//释放资源? ? ? ?s.close();? ? ? ?ss.close();?  }
}

注意事项:

  • accept方法是阻塞的,作用就是等待客户端连接

  • 客户端创建对象并连接服务器,此时是通过三次握手协议,保证跟服务器之间的连接

  • 针对客户端来讲,是往外写的,所以是输出流 针对服务器来讲,是往里读的,所以是输入流

  • read方法也是阻塞的

  • 客户端在关流的时候,还多了一个往服务器写结束标记的动作

  • 最后一步断开连接,通过四次挥手协议保证连接终止

3、三次握手和四次挥手
3.1 三次握手

3.2 四次挥手

4、TCP文件上传案例
  • 案例需求

    客户端:数据来自于本地文件,接收服务器反馈

    服务器:接收到的数据写入本地文件,给出反馈

  • 分析思路

    • 创建客户端对象,创建输入流对象指向文件,每读一次数据就给服务器输出一次数据,输出结束后使用shutdownOutput()方法告知服务端传输结束

    • 创建服务器对象,创建输出流对象指向文件,每接受一次数据就使用输出流输出到文件中,传输结束后,使用输出流给客户端反馈信息

    • 客户端接收服务端的回馈信息

  • 相关方法

    方法

    说明

    void shutdownInput()

    将此套接字的输入流放置在“流的末尾”

    void shutdownOutput()

    禁止用此套接字的输出流

  • 服务端优化思路

    • 服务端可以多次处理

      • 循环包裹while(true)

      • 使用UUID区分了重名文件,防止二次上传文件重名造成覆盖

    • 将服务器改进为多线程版本,满足多个客户端同时通信

    • 改为线程池

  • 代码实现

public class Client {? ?public static void main(String[] args) throws IOException {? ? ? ?//1、创建Socket对象指定ip和端口? ? ? ?Socket socket = new Socket("192.168.11.251",8888);? ? ? ?//2、获取传输数据的流对象(网络流)? ? ? ?InputStream is = socket.getInputStream();? ? ? ?OutputStream os = socket.getOutputStream();? ? ? ?//3、将字节流转换为字符串(读写的内容有中文)? ? ? ?BufferedReader br = new BufferedReader(new InputStreamReader(is));? ? ? ?PrintStream ps = new PrintStream(os);? ? ? ?File file = new File("D:\好哥哥.jpg");? ? ? ?//4、写出文件名? ? ? ?ps.println(file.getName());? ? ? ?//5、读取服务端消息? ? ? ?String state = br.readLine();? ? ? ?if("ok".equals(state)){? ? ? ? ? ?//6、上传文件(字节)? ? ? ? ? ?//创建本地字节输入流关联要上传的文件? ? ? ? ? ?FileInputStream fis = new FileInputStream(file);? ? ? ? ? ?byte[] bys = new byte[1024];? ? ? ? ? ?int len;? ? ? ? ? ?while((len=fis.read(bys))!=-1){? ? ? ? ? ? ? ?os.write(bys,0,len);? ? ? ? ?  }? ? ? ? ? ?//重点:写出结束标记给服务端? ? ? ? ? ?socket.shutdownOutput();? ? ? ? ? ?fis.close();? ? ? ? ? ?//7、读取上传结果? ? ? ? ? ?String result = br.readLine();? ? ? ? ? ?System.out.println(result);? ? ? ? ? ?//8、关流? ? ? ? ? ?socket.close();? ? ?  }?  }
}public class Server {? ?public static void main(String[] args) throws IOException {? ? ? ?//1、创建ServerSocket对象指定端口? ? ? ?ServerSocket server = new ServerSocket(8888);? ? ? ?System.out.println("服务端开启,等待客户端连接");
?? ? ? ?ThreadPoolExecutor pool = new ThreadPoolExecutor(? ? ? ? ? ? ? ?5,? ? ? ? ? ? ? ?10,? ? ? ? ? ? ? ?60,? ? ? ? ? ? ? ?TimeUnit.SECONDS,? ? ? ? ? ? ? ?new ArrayBlockingQueue<>(20),? ? ? ? ? ? ? ?Executors.defaultThreadFactory(),? ? ? ? ? ? ? ?new ThreadPoolExecutor.AbortPolicy()? ? ?  );
?? ? ? ?while (true) {? ? ? ? ? ?//2、调用accept方法响应客户端的请求? ? ? ? ? ?Socket socket = server.accept();
?? ? ? ? ? ?//new Thread(new SubmitFileTask(socket)).start();? ? ? ? ? ?pool.submit(new FileSubmitTask(socket));? ? ?  }?  }
}public class FileSubmitTask implements Runnable{? ?//为了拿到另一个类的数据,将其作为参数传进本类,在本类创建带参构造并接收该参数赋值给本类的成员变量,就拿到了? ?private Socket socket;? ?public FileSubmitTask(Socket socket) {? ? ? ?this.socket=socket;?  }
?? ?@Override? ?public void run() {? ? ? ?try {? ? ? ? ? ?//3、获取传输的输入流对象(网络流)? ? ? ? ? ?InputStream is = socket.getInputStream();? ? ? ? ? ?OutputStream os = socket.getOutputStream();? ? ? ? ? ?//4、将字节流转换为字符串(读写的内容有中文)? ? ? ? ? ?BufferedReader br = new BufferedReader(new InputStreamReader(is));? ? ? ? ? ?PrintStream ps = new PrintStream(os);? ? ? ? ? ?//5、读取客户端发送的文件名? ? ? ? ? ?String fileName = br.readLine();? ? ? ? ? ?//关联服务端的存储路径? ? ? ? ? ?File update = new File("D:\itheima\Resource", UUID.randomUUID()+fileName);? ? ? ? ? ?//6、写给客户端消息? ? ? ? ? ?ps.println("ok");? ? ? ? ? ?//7、创建本地字节输出流,关联存储路径? ? ? ? ? ?FileOutputStream fos = new FileOutputStream(update);? ? ? ? ? ?//8、IO读写? ? ? ? ? ?byte[] bys = new byte[1024];? ? ? ? ? ?int len;? ? ? ? ? ?while((len = is.read(bys))!=-1){? ? ? ? ? ? ? ?fos.write(bys,0,len);? ? ? ? ?  }? ? ? ? ? ?fos.close();? ? ? ? ? ?//9、写出上传成功? ? ? ? ? ?ps.println("上传成功!");? ? ? ? ? ?//10、关流? ? ? ? ? ?socket.close();? ? ?  } catch (IOException e) {? ? ? ? ? ?e.printStackTrace();? ? ?  }?  }
}

二、日志

程序中的日志可以用来记录程序运行过程中的信息,并可以进行永久存储。日志和输出语句的比较

输出语句

日志技术

输出位置

只能是控制台

可以将日志信息写入到文件或者数据库中

取消日志

需要修改代码,灵活性比较差

不需要修改代码,灵活性比较好

多线程

性能较差

性能较好

1、日志体系结构

  • 日志规范:一些接口,提供给日志的实现框架设计的标准

  • 日志框架:牛人或者第三方公司已经做好的日志记录实现代码,后来直接可以拿去使用

  • 因为对Commons Logging 的接口不满意,有人就搞了SLF4J;因为对Log4j的性能不满意,有人就搞了Logback

2、Logback快速入门
  • 官网: Logback Home

  • 三个技术模块

    模块名

    介绍

    locback-core

    该模块为其他两个模块提供基础代码,必须有。

    logback-classic

    完整实现了slf4j API的模块。

    logback-access

    logback-access 模块与 Tomcat 和 Jetty 等 Servlet 容器集成,以提供 HTTP 访问日志功能

2.1 操纵步骤
第一步:引入jar包

jar包本质来说就是压缩包,内部存储的都是别人已经写好的代码。在需要导包的项目模块下,和src平级的位置,创建lib目录,将需要的jar包都放进去,然后勾选Add as Library。导jar包只是目前的做法,后面会学maven来管理jar包,不用手动导入

第二步:导入配置文件

将日志的配置信息文件(logback.xml)复制到模块的src

  • 日志级别和配置文件详解

    通过通过logback.xml 中的标签可以设置输出位置和日志信息的详细格式。通常可以设置2个日志输出位置:一个是控制台、一个是系统文件中

第三步:获取日志对象使用
public class LogTest {? ?public static void main(String[] args) {? ? ? ?//获取记录日志对象? ? ? ?Logger logger = LoggerFactory.getLogger("LogTest.class");? ? ? ?//记录日志? ? ? ?logger.info("记录了一条日志");?  }
}

三、枚举

枚举是Java中的一种特殊类型,其作用是为了做信息的标志和信息的分类。枚举可以理解为一种多例设计模式,保证类的对象,在内存中只有固定的几个

1、定义格式

修饰符 enum 枚举类型{
//第一行都是罗列枚举类实例的名称
枚举项1,枚举项2,枚举项3;
}

enum Season{? ?SPRING,SUMMER,AUTUMN,WINTER;
}
2、枚举的特点
  • 所有枚举类都是 Enum 的子类

  • 我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项

  • 每一个枚举项其实就是该枚举的一个对象

  • 枚举也是类, 可以定义成员变量

  • 枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略

  • 枚举类可以有构造器,但必须是 private 的,它默认的也是 private 的。枚举项的用法比较特殊:枚举(“”);

  • 枚举类也可以有抽象方法,但是枚举项必须重写该方法

3、示例代码
public enum Season {
?? ?SPRING("春"){
?? ? ? ?//如果枚举类中有抽象方法? ? ? ?//那么在枚举项中必须要全部重写? ? ? ?@Override? ? ? ?public void show() {? ? ? ? ? ?System.out.println(this.name);? ? ?  }
??  },
?? ?SUMMER("夏"){? ? ? ?@Override? ? ? ?public void show() {? ? ? ? ? ?System.out.println(this.name);? ? ?  }?  },
?? ?AUTUMN("秋"){? ? ? ?@Override? ? ? ?public void show() {? ? ? ? ? ?System.out.println(this.name);? ? ?  }?  },
?? ?WINTER("冬"){? ? ? ?@Override? ? ? ?public void show() {? ? ? ? ? ?System.out.println(this.name);? ? ?  }?  };
?? ?public String name;
?? ?//空参构造? ?//private Season(){}?? ?//有参构造? ?private Season(String name){? ? ? ?this.name = name;?  }?? ?//抽象方法? ?public abstract void show();
}
?
public class EnumDemo {? ?public static void main(String[] args) {? ? ? ?//我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项? ? ? ?System.out.println(Season.SPRING);? ? ? ?System.out.println(Season.SUMMER);? ? ? ?System.out.println(Season.AUTUMN);? ? ? ?System.out.println(Season.WINTER);
?? ? ? ?//每一个枚举项其实就是该枚举的一个对象? ? ? ?Season spring = Season.SPRING;?  }
}
4、做信息标志方式(2种)
4.1 常量

虽然可以实现可读性,但是入参不受约束,代码相对不够严谨

4.2 枚举

代码可读性好,入参约束严谨,代码优雅,是最好的信息分类技术!建议使用!

相关文章:

Java进阶14 TCP日志枚举

Java进阶14 TCP&日志&枚举 一、网络编程TCP Java对基于TCP协议得网络提供了良好的封装&#xff0c;使用Socket对象来代表两端的通信端口&#xff0c;并通过Socket产生IO流来进行网络通信。 1、TCP协议发数据 1.1 构造方法 方法 说明 Socket(InetAddress address…...

Vue混入(Mixins)与插件开发深度解析

Vue混入&#xff08;Mixins&#xff09;与插件开发深度解析 Vue混入&#xff08;Mixins&#xff09;与插件开发深度解析1. Vue混入&#xff08;Mixins&#xff09;核心概念1.1 什么是混入1.2 基础使用方式1.3 选项合并策略1.4 全局混入及其风险1.5 混入的优缺点分析 2. 混入实战…...

[LVGL] 在VC_MFC中移植LVGL

前言&#xff1a; 0. 在MFC中开发LVGL的优点是可以用多个Window界面做辅助扩展 1.本文基于VC2022-MFC单文档框架移植lvgl8 2. gitee上下载lvgl8.3 源码&#xff0c;并将其文件夹改名为lvgllvgl: LVGL 是一个开源图形库&#xff0c;提供您创建具有易于使用的图形元素、漂亮的…...

leetcode_双指针 125.验证回文串

125.验证回文串 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是回文串 &#xff0c;返回 true &#xff…...

14.适配器模式(Adapter Pattern)

定义 适配器模式&#xff08;Adapter Pattern&#xff09; 是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一种接口。适配器模式通常用于将已有的类或遗留系统中的接口与新系统或目标接口进行兼容&#xff0c;从而能够在系统中无缝地使用不兼容…...

Crewai框架配置回调函数

官方文档里只指提了一句 不过不太难&#xff0c;在crew.py文件里配置一下就行了&#xff0c;下面是一个demo&#xff0c;这个函数会在research_task任务执行完触发&#xff08;配置LLM这里请看我这篇博客&#xff09; from crewai import Crew, Process, Agent, Taskfrom src.…...

大数据方向知识图谱及发展前景分析

目录 一、知识体系 二、大数据领域前景分析&#xff1a; 1. 市场需求 2. 技术趋势 3. 职业发展路径 4. 学习路线建议 5. 推荐认证体系 一、知识体系 大数据知识体系 ├── 基础理论 │ ├── 数学基础&#xff1a;概率统计、线性代数、离散数学 │ ├── 计算机基…...

Playwright 与 Selenium 的关系

Playwright 与 Selenium 的关系 Playwright 和 Selenium 都是流行的浏览器自动化测试工具&#xff0c;它们都可以用于 Web 应用的端到端测试&#xff0c;但它们在设计理念、架构和功能上存在一些差异。 以下是两者的主要关系对比&#xff1a; 特性PlaywrightSelenium开发语言…...

拧紧“安全阀”,AORO-P300 Ultra防爆平板畅通新型工业化通信“大动脉”

在油气管道泄漏的浓烟中&#xff0c;在矿道坍塌的密闭空间里&#xff0c;在洪水肆虐的救援现场&#xff0c;传统通讯设备频频失效的困境已成为历史。AORO-P300 Ultra防爆平板集5G通讯、红外感知、应急照明等实用功能于一体&#xff0c;以军工级防护与全场景智能应用&#xff0c…...

《C#之集训1-20121019c#基础》

&#xfeff;&#xfeff; C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。它是微软公司研究员Anders Hejlsberg的最新成果。 C#曾经的它在我眼中是很高大上的&#xff0c;一直没有目睹其风采&#xff0c;现在终于揭开了它神秘的面纱&#xf…...

基于docker搭建Kafka集群,使用KRaft方式搭建,摒弃Zookeeper

KAFKA基于docker使用KRaft进行集群搭建 环境&#xff1a;已成功搭建kafka服务 可点击链接跳转至安装kafka-3.8.0版本 并启用SASL认证 教程 使用基于Zookeeper方式搭建集群教程 kafka-3.8.0版本 并启用SASL认证 教程 搭建kafka-ui可视化工具 192.168.2.91 192.168.2.92 192…...

CAD导入与解析,助力工业数据可视化高效呈现

背景 在企业的日常设计与管理中&#xff0c;CAD图纸早已成为不可或缺的重要资产&#xff0c;多年来知识积累的载体&#xff0c;凝聚了大量的心血与智慧。然而&#xff0c;CAD图纸往往只作为静态文件保存&#xff0c;应用场景较为有限。在数字经济时代&#xff0c;如何让CAD图纸…...

基于docker部署kafka-3.8.0版本,并开启SASL认证模式

1、下载安装包 &#xff08;1&#xff09;https://kafka.apache.org/downloads 下载如下图版本 2、解压安装包 执行tar -xvf kafka_2.13-3.8.0.tgz命令对安装包进行解压。 3、增加配置文件 &#xff08;1&#xff09;进入 /kafka_2.13-3.8.0/config 目录 &#xff08;2&a…...

从零开始人工智能Matlab案例-KNN的二维数据分类

基于K最近邻&#xff08;K-Nearest Neighbors, KNN&#xff09;算法的二分类案例&#xff0c;包含完整MATLAB代码、算法原理和核心思想说明。此案例使用合成数据集&#xff0c;无需复杂数据预处理&#xff0c;适合快速理解。 案例&#xff1a;基于KNN的二维数据分类 目标&…...

90.子集||

要求所有可能的子集&#xff0c;不能重复&#xff0c;因此对于相同的数字&#xff0c;要考虑去重&#xff0c;去重的方式就是通过排序&#xff0c;排序后相同的数字相邻&#xff0c;这样进行实现迭代时&#xff0c;若没有选择上一个数&#xff0c;&#xff0c;其当前数字与上一…...

4 HBase 的高级 shell 管理命令

4 HBase 的高级 shell 管理命令 1.status 例如&#xff1a;显示服务器状态 hbase(main):058:0> status node012.whoami 显示 HBase 当前用户&#xff0c;例如&#xff1a; hbase> whoami3.list 显示当前所有的表 hbase> list4.count 统计指定表的记录数&#xff0c…...

Spring AOP 扫盲

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

DeepSeek 提示词之角色扮演的使用技巧

老六哥的小提示&#xff1a;我们可能不会被AI轻易淘汰&#xff0c;但是会被“会使用AI的人”淘汰。 在DeepSeek的官方提示库中&#xff0c;有“角色扮演&#xff08;自定义人设&#xff09;”的提示词案例。截图如下&#xff1a; 在“角色扮演”的提示词案例中&#xff0c;其实…...

python3中错误与异常初识

一. 简介 在 编写 Python时&#xff0c;经常会遇到一些报错信息。接下来开始学习 Python3 中错误和异常。 本文首先初步了解一下 Python3中的错误和异常。 二. python3 中错误与异常初识 Python 中有两种错误&#xff1a;语法错误与异常。 1. 语法错误 Python 的语法错误…...

设计模式六大原则和单例模式

设计模式 目的 实现可重用解决方案&#xff0c;构筑易维护、可扩展的软件系统。 六大原则 单一职责&#xff1a; 类的职责单一&#xff0c;一个方法做一件事。 开闭原则&#xff1a; 拓展开放&#xff0c;修改关闭。 里氏替换&#xff1a; 父类能出现的地方&#xff0c;子…...

【图像处理】- 基本图像操作

基本图像操作详解 基本图像操作是图像处理的基础&#xff0c;涵盖了对图像进行简单但重要的变换。以下是几种常见的基本图像操作及其详细说明&#xff1a; 1. 裁剪 (Cropping) 描述&#xff1a;从原始图像中提取一个矩形区域。 实现方法&#xff1a; 使用图像的坐标系指定…...

Attention is All You Need-Transformer模型论文精读+架构分析--简单易懂版

Foreword写在前面的话&#xff1a; 大家好&#xff0c;我是一名刚开始学习Transformer的新手。这篇文章是我在学习Transformer过程中的一些笔记和心得&#xff0c;希望能和同样在学习人工智能深度学习模型的朋友们分享。由于我的知识有限&#xff0c;文章中可能存在错误或不准确…...

Qt跨屏窗口的一个Bug及解决方案

如果我们希望一个窗口覆盖用户的整个桌面&#xff0c;此时就要考虑用户有多个屏幕的场景&#xff08;此窗口要横跨多个屏幕&#xff09;&#xff0c;由于每个屏幕的分辨率和缩放比例可能是不同的&#xff0c;Qt底层在为此窗口设置缩放比例&#xff08;DevicePixelRatio&#xf…...

Spark--算子执行原理

一、sortByKey SortByKey是一个transformation算子&#xff0c;但是会触发action&#xff0c;因为在sortByKey方法内部&#xff0c;会对每个分区进行采样&#xff0c;构建分区规则&#xff08;RangePartitioner&#xff09;。 内部执行流程 1、创建RangePartitioner part&…...

javaEE-6.网络原理-http

目录 什么是http? http的工作原理&#xff1a; 抓包工具 fiddler的使用 HTTP请求数据: 1.首行:​编辑 2.请求头(header) 3.空行&#xff1a; 4.正文&#xff08;body&#xff09; HTTP响应数据 1.首行&#xff1a;​编辑 2.响应头 3.空行&#xff1a; 4.响应正文…...

基于 docker 的mysql 5.7 主主集群搭建

创建挂载目录和配置文件 主节点1 mkdir -p /mysql_master_1/mysql/log mkdir -p /mysql_master_1/mysql/data mkdir -p /mysql_master_1/mysql/conf vim /mysql_master_1/mysql/conf/my.cnf[mysqld] datadir/var/lib/mysql #MySQL 数据库文件存放路径 server_id 1 #指定数据…...

windows版的docker如何使用宿主机的GPU

windows版的docker使用宿主机的GPU的命令 命令如下 docker run -it --nethost --gpus all --name 容器名 -e NVIDIA_DRIVER_CAPABILITIEScompute,utility -e NVIDIA_VISIBLE_DEVICESall 镜像名效果 (transformer) rootdocker-desktop:/# python Python 3.9.0 (default, Nov 15 …...

【C++】STL——list的使用

目录 &#x1f495;1.带头双向链表List &#x1f495;2.list用法介绍 &#x1f495;3.list的初始化 &#x1f495;4.size函数与resize函数 &#x1f495;5.empty函数 &#x1f495;6.front函数与back函数 &#x1f495;7.push_front,push_back,pop_front,pop_back函数…...

6.PPT:魏女士-高新技术企业政策【19】

目录 NO1234​ NO567 ​ NO1234 创建“PPT.pptx”考生文件夹Word素材文档&#xff1a;选中对应颜色的文字→选中对应的样式单击右键按下匹配对应文字&#xff1a;应用所有对应颜色的文字开始→创建新的幻灯片→从大纲&#xff1a;考生文件夹&#xff1a;Word素材重置 开始→版…...

MLA 架构

注&#xff1a;本文为 “MLA 架构” 相关文章合辑。 未整理去重。 DeepSeek 的 MLA 架构 原创 老彭坚持 产品经理修炼之道 2025 年 01 月 28 日 10:15 江西 DeepSeek 的 MLA&#xff08;Multi-head Latent Attention&#xff0c;多头潜在注意力&#xff09;架构 是一种优化…...