标准输入输出stdio和JSON-RPC

stdio的基本概念

标准输入输出stdio是进程间的一种通讯协议,类似于http通讯协议但是stdio只能运行在本地。

stdio主要有三个通道:stdout,stdin,stderr

stderr指的是异常处理

node案例

这里只要用node做示范

下方是一个简单标准输出的

server.js

javascript 复制代码
process.stdout.write("Hellow word!")

我们现在在终端里执行查看进程id的命令,可以看到当前进程的id为14400

bash 复制代码
tasklist | findstr cmd.exe

我们获取一下node服务进程的进程id

js 复制代码
process.stdout.write(process.pid + '\n')

我们可以发现终端窗口的进程和node服务的进程id不一致这是当然的。

那为什么我在node进程里打印或者输出的内容会显示在终端窗口中?

终端和node进程的通讯过程

可以想象的到终端窗口和node服务这两个进程之间肯定产生了联系,上面这段代码的实际含义是:在终端输入node server.js创建了一个node服务进程,然后在node服务中使用process.stdout.write标准输出结果,终端进程会监听子进程的输出结果然后打印在自己的窗口中

当然我们也可以反过来j监听父进程的输入

我们会发现执行下面这段代码后终端不会直接返回结果可以一直输入这是因为进程有监听服务不会里面返回结果

js 复制代码
process.stdin.on('data',(data) => {
    process.stdout.write(data + '\n')
})
node模拟步骤

我们也可以使用node来直接模拟这种情况

1、创建文件我们使用server.js来启用utils.js

可以看到直接执行utils.js进程才能在窗口打印内容

utils.js

js 复制代码
process.stdout.write("utils.js")

server.js

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

2、将通过server.js启用的utils.js打印的内容展示在终端中

修改server.js文件的代码设置监听子进程输出内容

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

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);
})
js 复制代码
process.stdin.on("data",(data) => {
    process.stdout.write(data)
})

从这些案例中可以了解进程之间通讯的一些过程和输入、输出的一些方式

JSON-RPC的基本概念

模型上下文协议(MCP)中的传输为客户端和服务器之间的通信提供基础。传输层负责处理消息如何发送和接收的底层机制。

简单来说就是进程之间通讯输入参数和返回值(输出)格式规范

jsonrpc代表版本(2.0)

id:请求编号用来将输入和输出对应起来

method:方法名称

params:请求参数

result:返回结果

error:错误信息

请求

js 复制代码
{
  jsonrpc: "2.0",
  id: number | string,
  method: string,
  params?: object
}

响应

js 复制代码
{
  jsonrpc: "2.0",
  id: number | string,
  result?: object,
  error?: {
    code: number,
    message: string,
    data?: unknown
  }
}

server.js

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

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;
    }
})
相关推荐
softshow10268 分钟前
Vue3 :封装 WebRTC 低延迟视频流与 WebSocket 实时状态驱动的大屏可视化
websocket·网络协议·webrtc
寻星探路20 分钟前
【深度长文】深入理解网络原理:TCP/IP 协议栈核心实战与性能调优
java·网络·人工智能·python·网络协议·tcp/ip·ai
上海云盾-高防顾问8 小时前
中小企业低成本渗透测试实操指南
网络协议·web安全·网络安全
kupeThinkPoem16 小时前
QJsonObject能否嵌套查找?
qt·json
桃花键神16 小时前
Undetectable接入亮数据代理IP深度测评:高效、稳定、适配性极强的海外多账号运营利器
网络协议·tcp/ip·php
BD_Marathon18 小时前
SpringMVC——json数据传递参数
json
野生技术架构师19 小时前
原来可以搭建一个HTTP服务
网络·网络协议·http
程序员欣宸19 小时前
LangChain4j实战之十二:结构化输出之三,json模式
java·人工智能·ai·json·langchain4j
秃了也弱了。21 小时前
FASTJSON库:阿里出品java界json解析库,使用与踩坑记录
java·开发语言·json
北京耐用通信1 天前
耐达讯自动化CANopen转Profibus网关:为风力发电场打造高可靠协议转换解决方案
人工智能·物联网·网络协议·自动化·信息与通信