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

理解 MCP 协议的数据传递:HTTP 之上的一层“壳子

以下是以 CSDN 博客的风格记录你对 MCP 协议数据传递的理解和发现,内容涵盖了 MCP 协议基于 HTTP 的本质、JSON-RPC 的“壳子”作用,以及为什么熟悉 HTTP 协议就足以理解 MCP 的数据传递。文章面向技术社区,结构清晰,适合分享。


理解 MCP 协议的数据传递:HTTP 之上的一层“壳子”

作者:[你的用户名]
日期:2025-04-13
标签:MCP 协议、HTTP、JSON-RPC、数据传递、AI 代理

背景

最近在研究 MCP(Model Context Protocol)协议,探索如何通过它实现 AI 代理的自动化任务,例如清理缓存文件夹。起初,我对 MCP 的数据传递机制感到困惑,因为我对数据传递的理解主要停留在 HTTP 协议的层面(例如 REST API 的 GET、POST 请求)。通过深入分析,我发现 MCP 协议的底层传输仍然是 HTTP,只不过在 HTTP 之上“套了一层壳子”——JSON-RPC 2.0 协议。这篇文章记录了我的发现和理解,分享给对 MCP 协议感兴趣的朋友。


发现过程

1. MCP 协议的底层传输:HTTP

MCP 协议是一个为 AI 代理设计的协议,允许 AI 代理安全地访问外部工具和数据源(例如文件系统)。通过研究,我发现 MCP 的数据传递完全依赖 HTTP 协议()。

1.1 MCP 的 HTTP 请求和响应

MCP 服务器监听一个 HTTP 端点(例如 http://localhost:8000/mcp),AI 代理通过 HTTP POST 请求发送数据,服务器返回 HTTP 响应。以下是一个典型的 MCP 请求和响应:

  • HTTP 请求(调用 list_files 工具):

    POST /mcp HTTP/1.1
    Host: localhost:8000
    Content-Type: application/json{"jsonrpc": "2.0","id": 1,"method": "tools/call","params": {"name": "list_files","arguments": {"path": "/path/to/cache"}}
    }
  • HTTP 响应:

    HTTP/1.1 200 OK
    Content-Type: application/json{"jsonrpc": "2.0","id": 1,"result": {"files": [{"name": "temp1.log", "path": "/path/to/cache/temp1.log", "mtime": "2025-03-01T12:00:00Z"},{"name": "temp2.log", "path": "/path/to/cache/temp2.log", "mtime": "2025-04-01T12:00:00Z"}]}
    }

1.2 与 HTTP API 的对比

如果你熟悉 HTTP API(例如 REST API),MCP 的数据传递模式非常相似:

  • HTTP API:通过 URL 和 HTTP 方法定义操作,例如 GET /files?path=/path/to/cache 获取文件列表。

  • MCP:通过 HTTP POST 发送 JSON 数据,操作定义在 JSON 的 method 字段中(例如 tools/call)。

发现:

  • MCP 的底层传输就是 HTTP,与我熟悉的 HTTP API 没有本质区别。请求是 HTTP POST,响应是 HTTP 200 OK,数据格式是 JSON。


2. MCP 的“壳子”:JSON-RPC 2.0

虽然 MCP 的底层是 HTTP,但它在 HTTP 之上定义了一层 JSON-RPC 2.0 协议(),这就是所谓的“壳子”。

2.1 JSON-RPC 的结构

JSON-RPC 是一种轻量级的远程过程调用(RPC)协议,通过 JSON 格式定义请求和响应。MCP 使用 JSON-RPC 来封装 AI 代理与 MCP 服务器之间的通信。

  • JSON-RPC 请求:

    json

    {"jsonrpc": "2.0","id": 1,"method": "tools/call","params": {"name": "list_files","arguments": {"path": "/path/to/cache"}}
    }
    • jsonrpc:协议版本。

    • id:请求 ID,用于匹配响应。

    • method:要调用的方法(例如 tools/call)。

    • params:方法参数。

  • JSON-RPC 响应:

    json

    {"jsonrpc": "2.0","id": 1,"result": {"files": [{"name": "temp1.log", "path": "/path/to/cache/temp1.log", "mtime": "2025-03-01T12:00:00Z"},{"name": "temp2.log", "path": "/path/to/cache/temp2.log", "mtime": "2025-04-01T12:00:00Z"}]}
    }
    • result:成功时的返回结果。

    • 如果失败,返回 error 字段。

2.2 JSON-RPC 与 HTTP API 的对比

  • HTTP API:操作通过 URL 和 HTTP 方法定义,例如 GET /files 获取文件列表,DELETE /files/temp1.log 删除文件。

  • JSON-RPC:操作通过 JSON 的 method 字段定义(例如 tools/call),参数通过 params 传递,URL 通常是固定的(例如 /mcp)。

等价转换:

  • JSON-RPC 请求:

    json

    {"jsonrpc": "2.0","id": 1,"method": "tools/call","params": {"name": "list_files","arguments": {"path": "/path/to/cache"}}
    }
  • 等价的 HTTP API 请求:

    GET /files?path=/path/to/cache HTTP/1.1
    Host: localhost:8000

发现:

  • JSON-RPC 只是 HTTP 请求体的一种特定格式。method 相当于 HTTP API 的 URL 路径,params 相当于请求体或查询参数。熟悉 HTTP API 后,JSON-RPC 非常容易理解。


3. 为什么熟悉 HTTP 协议就够了?

通过对比,我发现 MCP 协议的数据传递本质上就是 HTTP 传输,只不过请求体的内容是 JSON-RPC 格式。

3.1 MCP 的数据传递流程

以清理缓存文件夹的任务为例:

  1. AI 代理发送 HTTP POST 请求,调用 list_files 工具,获取文件列表。

  2. MCP 服务器返回 HTTP 响应,包含文件列表(JSON 格式)。

  3. AI 代理解析响应,筛选出超过 30 天的文件(例如 temp1.log)。

  4. AI 代理发送另一个 HTTP POST 请求,调用 delete_file 工具。

  5. MCP 服务器返回 HTTP 响应,确认删除成功。

HTTP 视角:

  • 整个流程与 HTTP API 的请求-响应模式完全一致。

  • 唯一不同的是,MCP 的请求体是 JSON-RPC 格式,而不是普通的 JSON 数据。

3.2 熟悉 HTTP 后需要额外关注的点

虽然熟悉 HTTP 协议就足够理解 MCP 的数据传递,但需要额外关注以下两点:

  1. JSON-RPC 格式:

    • 理解 JSON-RPC 的核心字段(method、params、result 等)。

    • 把 method 看作 HTTP API 的 URL 路径,把 params 看作请求体。

  2. MCP 的方法和工具:

    • MCP 定义了一些方法(例如 tools/call)和工具(例如 list_files、delete_file)。

    • 可以通过 tools/list 请求获取可用工具:

      json

      {"jsonrpc": "2.0","id": 1,"method": "tools/list","params": {}
      }

发现:

  • 熟悉 HTTP 协议后,只需要几分钟就能学会 JSON-RPC 的格式和 MCP 的方法/工具,MCP 的数据传递就完全可以理解。


4. MCP 的“壳子”带来的额外功能

虽然 MCP 是在 HTTP 之上“套了个壳子”,但这个壳子带来了一些额外的功能:

  1. 结构化的通信:

    • JSON-RPC 提供了统一的请求和响应格式(method、params、result),比 HTTP API 更结构化。

    • AI 代理可以更容易地解析和处理数据。

  2. 支持复杂通信模式:

    • MCP 支持 Server-Sent Events(SSE)(),用于实时推送任务状态。

    • MCP 支持异步任务,AI 代理可以通过轮询或 SSE 获取任务进度。

  3. 工具化的接口:

    • MCP 通过工具(例如 list_files)提供标准化的接口,AI 代理可以直接调用,无需关心底层实现。

SSE 示例:

  • AI 代理订阅任务状态:

    GET /mcp/sse HTTP/1.1
    Host: localhost:8000
    Accept: text/event-stream
  • 服务器推送更新:

    event: TaskStatusUpdateEvent
    data: {"taskId": "task-001", "status": "working"}

发现:

  • SSE 是 HTTP 的扩展功能,如果熟悉 HTTP API 的 SSE,MCP 的实时推送模式也很容易理解。


5. 对比 A2A 协议:同样的“壳子”

A2A(Agent2Agent)协议也基于 HTTP 和 JSON-RPC(),但用途不同:

  • MCP:AI 代理与外部工具的交互(例如文件系统),通过 tools/call 调用工具。

  • A2A:代理之间的通信,通过 tasks/send 提交任务,支持协作()。

A2A 的 HTTP 请求示例:

  • 请求:

    POST /a2a HTTP/1.1
    Host: localhost:9000
    Content-Type: application/json{"jsonrpc": "2.0","id": 1,"method": "tasks/send","params": {"taskId": "task-001","message": {"role": "user","parts": [{"type": "TextPart", "value": "List files in /path/to/cache"}]}}
    }
  • 响应:

    HTTP/1.1 200 OK
    Content-Type: application/json{"jsonrpc": "2.0","id": 1,"result": {"taskId": "task-001","status": "working"}
    }

发现:

  • A2A 和 MCP 都基于 HTTP,数据传递方式相同(HTTP POST + JSON-RPC)。

  • A2A 的“壳子”更注重任务管理和代理协作,而 MCP 的“壳子”更注重工具调用。


总结

通过这次研究,我对 MCP 协议的数据传递有了更清晰的理解:

  1. MCP 的底层是 HTTP:MCP 的数据传递完全依赖 HTTP,与 HTTP API 的请求-响应模式一致。

  2. JSON-RPC 是“壳子”:MCP 在 HTTP 之上使用 JSON-RPC 2.0 协议,定义了结构化的请求和响应格式。

  3. 熟悉 HTTP 就够了:如果你已经熟悉 HTTP 协议(例如 POST 请求、JSON 数据、SSE),只需要额外理解 JSON-RPC 的格式和 MCP 的方法/工具,就能完全掌握 MCP 的数据传递。

未来计划:

  • 抓包分析 MCP 的 HTTP 请求,深入理解 JSON-RPC 的细节。

  • 探索 A2A 协议的通信模式(例如 SSE 和推送通知),学习更复杂的协作场景。

如果你对 MCP 协议或 HTTP 相关技术有更多想法,欢迎留言讨论!


参考资料

  1. Anthropic 官方文档:Introducing the Model Context Protocol

  2. Google A2A 协议文档:Agent2Agent Protocol Specification

  3. JSON-RPC 2.0 规范:JSON-RPC 2.0 Specification


以上是 CSDN 风格的博客记录,总结了你的发现和理解。如果你需要调整某些部分(例如添加代码示例或截图),可以告诉我!

相关文章:

理解 MCP 协议的数据传递:HTTP 之上的一层“壳子

以下是以 CSDN 博客的风格记录你对 MCP 协议数据传递的理解和发现,内容涵盖了 MCP 协议基于 HTTP 的本质、JSON-RPC 的“壳子”作用,以及为什么熟悉 HTTP 协议就足以理解 MCP 的数据传递。文章面向技术社区,结构清晰,适合分享。 理…...

word中的mathtype公式编辑时,大(中)括号会存在很大的空白

如下所示,公式编辑的时候发现总会多一个空白,怎么删也删不掉 这主要是公式的分隔符问题,选择:“格式”-“分隔符对齐”,选择第三个可以消除下面的空白 点击“确认”,效果如下所示:...

【Java】查看当前 Java 使用的垃圾回收器

一、查询 Code import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; import java.util.Arrays; import java.util.List;public class GCTypeDetector {public static void main(String[] args) {List<GarbageCollectorMX…...

Linux编程c/c++程序

前言 我们Windows系统下的idea可以说是非常智能了&#xff0c;集成了各种开发工具&#xff0c;包括并不限于编辑器/编译器/调试器/自动化构建工具/版本控制工具……而在Linux系统中&#xff0c;每个组件之间是相互独立的&#xff0c;每个组件各司其职&#xff0c;共同协作完成…...

【前端网络请求入门】XMLHttpRequest与Fetch保姆级教程

新手学前端时&#xff0c;经常会被「如何让网页和服务器说话」难住。今天我们用最通俗的语言&#xff0c;把浏览器最常用的两种网络请求方式——XMLHttpRequest和Fetch讲清楚&#xff0c;还会带完整的代码示例&#xff0c;跟着敲一遍就能上手&#xff01; 一、先搞懂「网络请求…...

redis单机安装

redis单机安装 下载地址 官网&#xff1a;https://redis.io/下载列表页面&#xff1a;https://download.redis.io/releases/ 说明 版本选择&#xff1a;redis-7.0.0.tar.gz下载地址&#xff1a;https://download.redis.io/releases/redis-7.0.0.tar.gz 安装前准备 在linu…...

从零手写RPC-version0

参考文档 https://github.com/he2121/MyRPCFromZero Version-0 0、写项目第一步&#xff0c;先添加远程仓库 先在 github 上新建仓库&#xff0c;然后将本地新建的项目推送到远程仓库中 由于网上很多教程&#xff0c;所以本节不再赘述&#xff08;可以让 chatGPT给出一个完…...

MOM成功实施分享(八)汽车活塞生产制造MOM建设方案(第二部分)

在制造业数字化转型的浪潮中&#xff0c;方案对活塞积极探索&#xff0c;通过实施一系列数字化举措&#xff0c;在生产管理、供应链协同、质量控制等多个方面取得显著成效&#xff0c;为行业提供了优秀范例。 1.转型背景与目标&#xff1a;活塞在数字化转型前面临诸多挑战&…...

二、Android Studio环境安装

一、下载安装 下载 Android Studio 和应用工具 - Android 开发者 | Android DevelopersAndroid Studio 提供了一些应用构建器以及一个已针对 Android 应用进行优化的集成式开发环境 (IDE)。立即下载 Android Studio。https://developer.android.google.cn/studio?hlzh-c…...

构件与中间件技术:概念、复用、分类及标准全解析

以下是对构件与中间件技术相关内容更详细的介绍&#xff1a; 一、构件与中间件技术的概念 1.构件技术 定义&#xff1a;构件是具有特定功能、可独立部署和替换的软件模块&#xff0c;它遵循一定的规范和接口标准&#xff0c;能够在不同的软件系统中被复用。构件技术就是以构…...

亲手打造可视化故事线管理工具:开发全流程、难点突破与开发过程经验总结

亲手打造可视化故事线管理工具&#xff1a;开发全流程、难点突破与开发过程经验总结 作为还没入门的业余编程爱好者&#xff0c;奋战了2天&#xff0c;借助AI开发一款FLASK小工具&#xff0c;功能还在完善中&#xff08;时间轴可以跟随关联图缩放&#xff0c;加了一个用C键控制…...

CSS 字体学习笔记

在网页设计中&#xff0c;字体的使用对于提升用户体验和页面美观性至关重要。CSS 提供了一系列字体属性&#xff0c;用于控制文本的显示效果。以下是对 CSS 字体属性的详细学习笔记。 一、字体系列&#xff08;font-family&#xff09; 1. 字体系列的分类 在 CSS 中&#xf…...

通过 spring ai 对接 deepseek ai 大模型通过向量数据库,完成 AI 写标书及构建知识库功能的设计与开发

AI写标书及知识库构建详细设计方案 一、系统架构设计 +-------------------+ +-------------------+ +-------------------+ | 用户交互层 | | AI服务层 | | 知识库存储层 | | (Web/API) |---->| (Spring AI) |---…...

cropperjs 2.0裁剪图片后转base64提示“Tainted canvases may not be exported”跨域问题的解决办法。

目录 为什么会有这边文章 辛酸历程&#xff0c;不看也罢 想解决问题&#xff0c;看这里就够了 问题已解决&#xff0c;后边还是废话 为什么会有这边文章 最近&#xff0c;做一个项目需要用在前端实现图片裁剪功能&#xff0c;毋庸置疑&#xff0c;cropperjs是不二选择。当在…...

2、JSX:魔法世界的通行证——用魔法符号编织动态界面

一、开篇&#xff1a;魔法符号的觉醒 "看呐&#xff0c;赫敏&#xff01;这根魔杖&#xff08;React组件&#xff09;为何能自动绘制出动态界面&#xff1f;"年轻的巫师学徒罗恩指着闪烁的屏幕惊呼。 "这就是JSX魔法阵的威力&#xff0c;"邓布利多校长挥舞…...

八大排序算法

目录 八大排序算法排序算法的稳定性比较排序插入排序直接插入排序希尔排序希尔排序的时间复杂度计算 选择排序直接选择排序堆排序 交换排序冒泡排序快速排序递归hoare版本挖坑法lomuto前后指针 非递归 归并排序排序性能对比 非比较排序计数排序 比较排序算法总结 八大排序算法 …...

搭建一个Spring Boot聚合项目

1. 创建父项目 打开IntelliJ IDEA&#xff0c;选择 New Project。 在创建向导中选择 Maven&#xff0c;确保选中 Create from archetype&#xff0c;选择 org.apache.maven.archetypes:maven-archetype-quickstart。 填写项目信息&#xff1a; GroupId&#xff1a;com.exampl…...

Google A2A协议解析:构建分布式异构多Agent系统

一、A2A 是什么&#xff1f;有什么用&#xff1f; 1.1 A2A 是什么&#xff1f; A2A&#xff08;Agent-to-Agent Protocol&#xff09;是Google最新推出的一项开源协议&#xff0c;旨在为AI智能体&#xff08;Agents&#xff09;提供标准化的通信方式。它允许不同框架&#xf…...

【Android读书笔记】读书笔记记录

文章目录 一. Android开发艺术探索1. Activity的生命周期和启动模式1.1 生命周期全面分析 一. Android开发艺术探索 1. Activity的生命周期和启动模式 1.1 生命周期全面分析 onPause和onStop onPause后会快速调用onStop&#xff0c;极端条件下直接调用onResume 当用户打开新…...

支持selenium的chrome driver更新到135.0.7049.84

最近chrome释放新版本&#xff1a;135.0.7049.84 如果运行selenium自动化测试出现以下问题&#xff0c;是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only su…...

【玩泰山派】MISC(杂项)- 使用vscode远程连接泰山派进行开发

文章目录 前言流程1、安装、启动sshd2、配置一下允许root登录3、vscode中配置1、安装remote插件2、登录 **注意** 前言 有时候要在开发板中写一写代码&#xff0c;直接在终端中使用vim这种工具有时候也不是很方便。这里准备使用vscode去通过ssh远程连接泰山派去操作&#xff0…...

利用阿里云企业邮箱服务实现Python群发邮件

目录 一、阿里云企业邮箱群发邮件全流程实现 1. 准备工作与环境配置 2. 收件人列表管理 3. 邮件内容构建 4. 附件添加实现 5. 邮件发送核心逻辑 二、开发过程中遇到的问题与解决方案 1. 附件发送失败问题 2. 中文文件名乱码问题 3. 企业邮箱认证失败 三、完整工作流…...

中文编码,GB系列,UTF

图片来源&#xff1a;https://zhuanlan.zhihu.com/p/701690894 文章目录 ASCIIGB系列编码UTF编码 ASCII American Standard Code for Information Interchange 一个字节&#xff0c;但其实只用了一半&#xff1a; 128个字符 GB系列编码 “国标” 和ASCII是兼容的。 GB2312…...

车载以太网-TLS

文章目录 车载以太网与TLS的技术背景核心定位车载以太网TLS的技术架构车载TLS的核心安全机制TLS报文结构详解TLS工作机制密钥交换与计算流程标题完整握手流程(1-RTT)数据传输加密流程车载TLS的独特优化策略车载TLS的安全威胁相关标准车载以太网TLS(Transport Layer Security…...

【大英赛】大英赛准备笔记

听力 总结 提醒专注 一题一个听力时&#xff0c;听是重点 抓紧时间往后审题 比较容易的部分&#xff1a;secA & secD中的dictation&#xff0c;在大致审当前的基础上&#xff0c;分别利用这个时间提前看后面的secB√& summery secA 听之前应当大致审选项&#x…...

有序数组的平方

暴力排序 每个数平方以后排个序 class Solution { public:vector<int> sortedSquares(vector<int>& nums) {int slow0,fast0;int nnums.size();while(fast<n){nums[slow]nums[fast]*nums[fast];fast;slow;}sort(nums.begin(),nums.end());return nums;} }…...

Python基于Django的房屋信息可视化及价格预测系统(附源码,文档说明)

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

【5G-A学习】ISAC通信感知一体化学习小记

通信感知一体化&#xff08;Integrated Sensing and Communication, ISAC&#xff09;是一种将无线通信与环境感知功能深度融合的技术&#xff0c;通过共享硬件、频谱和信号处理流程&#xff0c;实现通信与感知的协同增效。其核心原理及无人机与飞鸟的识别方式如下&#xff1a;…...

深入解析@Validated注解:Spring 验证机制的核心工具

一、注解出处与核心定位 1. 注解来源 • 所属框架&#xff1a;Validated 是 Spring Framework 提供的注解&#xff08;org.springframework.validation.annotation 包下&#xff09;。 • 核心定位&#xff1a; 作为 Spring 对 JSR-380&#xff08;Bean Validation 2.0&#…...

学生考勤管理系统(jsp+ssh+mysql5.x)含文档

学生考勤管理系统&#xff08;jspsshmysql5.x&#xff09;含万字详细文档 学生考勤管理系统是一个用于管理学生出勤和请假的系统&#xff0c;系统登录页面提供账号和密码输入框&#xff0c;用户可以选择角色进行登录。系统主菜单包括班级管理、用户管理、课程表管理和考勤情况…...

【响应式编程】Reactor 常用操作符与使用指南

文章目录 一、创建操作符1. just —— 创建包含指定元素的流2. fromIterable —— 从集合创建 Flux3. empty —— 创建空的 Flux 或 Mono4. fromArray —— 从数组创建 Flux5. fromStream —— 从 Java 8 Stream 创建 Flux6. create —— 使用 FluxSink 手动发射元素7. generat…...

为什么我们需要if __name__ == __main__:

[目录] 0.前言 1.什么是 __name__&#xff1f; 2.if __name__ __main__: 的作用 3.为何Windows更需if __name__ &#xff1f;前言 if __name__ __main__: 是 Python 中一个非常重要的惯用法&#xff0c;尤其在使用 multiprocessing 模块或编写可导入的模块时。它的作用是区分…...

Week 1: Time Complexity, Rectangle Geometry

问题集 Square PastureBucket BrigadeBlocked BillboardBlocked Billboard IIWord ProcessorDo You Know Your ABCs?The Cow-SignalD3C - White Sheet 视频解析 Square Pasture Bucket Brigade Blocked Billboard Blocked Billboard II Word Processor Do You Know Your AB…...

论文学习:《通过基于元学习的图变换探索冷启动场景下的药物-靶标相互作用预测》

原文标题&#xff1a;Exploring drug-target interaction prediction on cold-start scenarios via meta-learning-based graph transformer 原文链接&#xff1a;https://www.sciencedirect.com/science/article/pii/S1046202324002470 药物-靶点相互作用&#xff08;DTI&…...

STM32 HAL库 OLED驱动实现

一、概述 1.1 OLED 显示屏简介 OLED&#xff08;Organic Light - Emitting Diode&#xff09;即有机发光二极管&#xff0c;与传统的 LCD 显示屏相比&#xff0c;OLED 具有自发光、视角广、响应速度快、对比度高、功耗低等优点。在嵌入式系统中&#xff0c;OLED 显示屏常被用…...

UE5蓝图之间的通信------接口

一、创建蓝图接口 二、双击创建的蓝图接口&#xff0c;添加函数&#xff0c;并重命名新函数。 三、在一个蓝图&#xff08;如玩家角色蓝图&#xff09;中实现接口&#xff0c;如下图&#xff1a; 步骤一&#xff1a;点击类设置 步骤二&#xff1a;在细节面板已经实现的接口中…...

封装Tcp Socket

封装Tcp Socket 0. 前言1. Socket.hpp2. 简单的使用介绍 0. 前言 本文中用到的Log.hpp在笔者的历史文章中都有涉及&#xff0c;这里就不再粘贴源码了&#xff0c;学习地址如下&#xff1a;https://blog.csdn.net/weixin_73870552/article/details/145434855?spm1001.2014.3001…...

深入解析 Android 图形系统:Canvas、Skia、OpenGL 与 SurfaceFlinger 的协作

在 Android 应用开发中&#xff0c;流畅的 UI 渲染是用户体验的核心。但你是否好奇&#xff0c;一个简单的 View 是如何从代码中的 onDraw() 方法一步步变成屏幕上的像素的&#xff1f;本文将从底层图形系统的视角&#xff0c;解析 Android 中 Canvas、Skia、OpenGL ES 和 Surf…...

LeetCode每日一题4.13

1922. 统计好数字的数目 问题 问题分析 题目要求我们找到长度为 n 且满足特定条件&#xff08;偶数下标处为偶数&#xff0c;奇数下标处为质数&#xff09;的数字字符串的总数&#xff0c;并对 (10^9 7) 取余。 思路 1.枚举 生成所有可能的数字字符串&#xff1a;对于长度…...

Java学习——day29(并发控制高级工具与设计模式)

文章目录 1. 并发控制高级工具简介1.1 CountDownLatch1.2 CyclicBarrier1.3 Semaphore1.4 并发设计模式 2. 扩展生产者—消费者示例2.1 示例代码 3. 代码详解3.1 主类 ExtendedProducerConsumerDemo3.2 Buffer 类3.3 Producer 类3.4 Consumer 类 4. 编译与运行结果4.1 编译4.2 …...

使用FormData格式上传图片

为什么要使用FormData格式上传图片 1. 为什么使用 FormData&#xff1f; FormData 是一种专门用于构建表单数据的对象&#xff0c;它能够以 multipart/form-data 格式发送数据&#xff0c;这是文件上传的标准格式。以下是使用 FormData 的主要原因&#xff1a; 简单易用 直…...

Tkinter表格与列表框应用

在图形用户界面(GUI)开发中,表格和列表框是常用的控件,用于显示和管理大量的数据。Tkinter提供了Listbox控件来显示简单的列表数据,而对于更复杂的表格数据,可以使用Treeview控件(属于ttk模块)来实现。这一章将介绍如何使用Listbox和Treeview来显示和操作数据,帮助您处…...

【Excel】数据透视表月度数据排序不正确

【问题】 插入数据透视表后&#xff0c;月度列显示的日期&#xff0c;是按照文本格式排序的&#xff0c;显然与实际月份排序并不相符。 【目的】 按照从1月份到12月份进行自然月度排序。 【方法】 步骤一&#xff1a; 在任意一处&#xff0c;输入“1月”-“12月”&#…...

HCIP第十天

OSPF的数据包 OSPF是跨层封装协议,直接封装在网络层之上 --- 需要IP协议使用一个协议号来标定 OSPF --- 89 OSPF的头部 版本 --- OSPF的版本 --- 2 类型 --- OSPF数据包的类型 --- hello -- 1 DBD -- 2 LSR -- 3 LSU -- 4 LSACK -- 5 路由器ID --- RID --- 携带的是发出O…...

Vue2,Vue3知识大全

Vue 1.了解vue,快速上手 vue是一个用于构建用户的界面的渐进式框架. vue的两种使用方法: vue核心包开发 场景:局部模块改造 vue核心包&vue插件 工程化开发 场景:整站开发 1.创建一个vue实例: 2.插值表达式 1.插值表达式是一种Vue的模版语法 作用:利用表达式进行插值…...

java面向对象02:回顾方法

回顾方法及加深 定义方法 修饰符 返回类型 break&#xff1a;跳出switch和return的区别 方法名 参数列表 package com.oop.demo01;//Demo01类 public class Demo01 {//main方法public static void main(String[] args) {}/*修饰符 返回值类型 方法名(...){//方法体return…...

【Ubuntu】【树莓派】Linux系统的远程终端登录、远程图形桌面访问、 X图形窗口访问和文件传输操作

目录 一、Ubuntu远程终端并实现文件上传下载 1.1Ubuntu桥接模式设置和新用户的创建 1.2Ubuntu的远程登录并上传和下载文件 1.3在Xming中进行Ubuntu的图形访问 二、树莓派远程登录并实现文件上传下载 2.1树莓派在putty上的远程登录 2.2使用ftp远程登录并实现文件上传下载…...

Linux Kernel 2

地址空间&#xff08;Address Space&#xff09; 一、物理地址空间&#xff08;Physical Address Space&#xff09; 物理地址空间 是指 RAM 和设备内存 在系统内存总线上所呈现的地址布局。 举例&#xff1a;在典型的 32 32 32 位 Intel 架构中&#xff0c; RAM&#xff08…...

二.springBoot项目集成ElasticSearch及使用

二.springBoot项目集成ElasticSearch及使用 1.依赖引入2.ElasticSearch常见用法 1.依赖引入 <!--elasticsearch搜索引擎--> <!--高版本7.0后TransportClient已被淘汰&#xff0c;用rest-high-level-client代替--> <dependency><groupId>org.elasticse…...

从三次方程到复平面:复数概念的奇妙演进(一)

注&#xff1a;本文为 “复数 | 历史 / 演进” 相关文章合辑。 因 csdn 篇幅限制分篇连载&#xff0c;此为第一篇。 生料&#xff0c;不同的文章不同的点。 机翻&#xff0c;未校。 Reflections on the History of Complex Numbers 复数的历史回顾 The first occurrence o…...