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

标准输入输出stdio和JSON-RPC

stdio的基本概念

标准输入输出stdio是进程间的一种通讯协议,类似于http通讯协议但是stdio只能运行在本地。
stdio主要有三个通道:stdout,stdin,stderr
stderr指的是异常处理

node案例

这里只要用node做示范
下方是一个简单标准输出的

server.js

process.stdout.write("Hellow word!")

在这里插入图片描述
我们现在在终端里执行查看进程id的命令,可以看到当前进程的id为14400

tasklist | findstr cmd.exe

在这里插入图片描述
我们获取一下node服务进程的进程id

process.stdout.write(process.pid + '\n')

在这里插入图片描述
我们可以发现终端窗口的进程和node服务的进程id不一致这是当然的。
那为什么我在node进程里打印或者输出的内容会显示在终端窗口中?

终端和node进程的通讯过程

可以想象的到终端窗口和node服务这两个进程之间肯定产生了联系,上面这段代码的实际含义是:在终端输入node server.js创建了一个node服务进程,然后在node服务中使用process.stdout.write标准输出结果,终端进程会监听子进程的输出结果然后打印在自己的窗口中
在这里插入图片描述
当然我们也可以反过来j监听父进程的输入
我们会发现执行下面这段代码后终端不会直接返回结果可以一直输入这是因为进程有监听服务不会里面返回结果

process.stdin.on('data',(data) => {process.stdout.write(data + '\n')
})

在这里插入图片描述

node模拟步骤

我们也可以使用node来直接模拟这种情况
1、创建文件我们使用server.js来启用utils.js
可以看到直接执行utils.js进程才能在窗口打印内容
utils.js

process.stdout.write("utils.js")

server.js

const { spawn } = require("node:child_process")
spawn("node",["utils.js"])

在这里插入图片描述
2、将通过server.js启用的utils.js打印的内容展示在终端中
修改server.js文件的代码设置监听子进程输出内容

const { spawn } = require("node:child_process")
const childProcess = spawn("node",["utils.js"])
childProcess.stdout.on("data",(data) => {process.stdout.write(data)
})

在这里插入图片描述
3、通过代码来操作进程的输入和输出
正常用户使用应用时肯定不可能通过终端操作
现在模型一下通过代码控制进程的输入输出
逐步打印数组中内容
server.js

const { spawn } = require("node:child_process")
const childProcess = spawn("node",["utils.js"])
childProcess.stdout.on("data",(data) => {process.stdout.write(data)
})
const _temp = ['ask','me','why']
_temp.forEach((msg,index) => {setTimeout(() => {childProcess.stdin.write(msg + '\n')}, index * 1000);
})
process.stdin.on("data",(data) => {process.stdout.write(data)
})

在这里插入图片描述
从这些案例中可以了解进程之间通讯的一些过程和输入、输出的一些方式

JSON-RPC的基本概念

模型上下文协议(MCP)中的传输为客户端和服务器之间的通信提供基础。传输层负责处理消息如何发送和接收的底层机制。
简单来说就是进程之间通讯输入参数和返回值(输出)格式规范
jsonrpc代表版本(2.0)
id:请求编号用来将输入和输出对应起来
method:方法名称
params:请求参数
result:返回结果
error:错误信息
请求

{jsonrpc: "2.0",id: number | string,method: string,params?: object
}

响应

{jsonrpc: "2.0",id: number | string,result?: object,error?: {code: number,message: string,data?: unknown}
}

server.js

const {spawn
} = require("node:child_process")const childProcess = spawn("node", ["utils.js"])
var obj = {jsonrpc: "2.0",id: 1,method: 'sum',params: {a: 1,b: 2}
}
process.stdout.write(JSON.stringify(obj))childProcess.stdout.on("data", (data) => {process.stdout.write(data)
})

utils.js

function sum(a, b) {return a + b
}
process.stdin.on("data", (data) => {var obj = JSON.parse(data)switch (obj.method) {case "sum":var _temp = {jsonrpc: "2.0",id: obj.id,result: sum(obj.params.a, obj.params.b),}process.stdout.write(JSON.stringify(_temp))break;}
})
http://www.dtcms.com/a/609879.html

相关文章:

  • 免费seo网站推荐一下软件手机网站建立教程
  • 有哪些网站可以用常州小程序开发报价
  • Python自动化浏览器操作与定时任务实战指南
  • web中国民族文化展示网站4页面
  • 【剑斩OFFER】算法的暴力美学——【模板】前缀和
  • php网站建设考试新品发布会的作用
  • 视频模板网站推荐建筑装饰网站模板
  • PyCharm 软件关联 GitHub 账户
  • 中东核心支付方式
  • 2025数维杯秋季赛赛中陪跑助攻进行中
  • 人工智能基础知识笔记二十:构建一个简单的Agent+MCP Server
  • 零基础入门C语言之贪吃蛇的实现
  • Origin将2D普通的XPS曲线图升级为三维XPS瀑布图
  • 【C++】哈希表算法习题
  • 上传网站页面打不开怎么办莆田网站制作企业
  • Kotlin协程Flow流buffer缓冲批量任务或数据,条件筛选任务或数据
  • BuildingAI 控制台智能体菜单和页面功能PRD
  • 球机与云台摄像机的差异解析
  • Opencv(十二):图像矫正
  • Muon 优化器:通过正交化动量矩阵革命性地加速 AI 大模型训练
  • 11.14 脚本网页游戏 猜黑红
  • 网站引导页的作用网络营销msn是什么
  • 余姚网站开发wordpress头像同步
  • vxe-table 配置 ajax 加载列表数据,配置分页和查询搜索表单
  • worldpress 建站直播app定制开发
  • Java IDEA学习之路:第九周课程笔记归纳
  • Node.js 配置管理:生物启发式系统与跨维度架构
  • 《强量化 Transformers:开启计算机视觉新篇》
  • 免费做店招的网站国外用wordpress
  • 网站制作器手机版北京网页设计制作