月鼠小说app最新版
65.88MB · 2025-10-03
这一章主要对MCP的前置知识进行学习:stdio(通信方式)、JSON-RPC(通信格式)
stdio:standard input and output (标准输入输出)
进程之间是相互独立的,而进程需要与外界进行通信,通信的方式有很多,其中一种就是stdio。它能够让一个进程 通过标准输出接口(stdout) 向外界发送信息、外界也可以 通过它的标准输入接口(stdin) 向进程中写入一些信息。
用node.js来写个简单案例:
//创建一个server.js
//process进程 stdout标准输出
process.stdout.write('Hello World!!n')
然后在终端中运行它node server.js
(意思:启动一个node进程,参数是'server.js'),就会发现终端中打印了Hello World!!
。没错看起来效果很像console.log()
,因为在node环境中console.log()
的内部确实是调用了process.stdout.write()
加上一些额外处理。
那我们刚刚说了,stdio是通信方式呀,那这里是谁跟谁通信了嘞?这里其实是node进程与终端进行通信了:终端本身是一个进程,它在 启动子进程(这里是node进程) 的时候会去 监听子进程的标准输出接口,终端已经内置了这些流程,当它监听到数据后就会将其显示在终端。
//server.js
//监听父进程(终端)输入
process.stdin.on('data',(data)=>{
const resp = `回复 ${data}n`
process.stdout.write(resp)
})
运行后,会发现终端中就会一直运行着这个node进程,可以在终端输入数据然后回车来发送,就可以被node子进程接收到。那么我们就会发现,在这个场景下,终端类似于客户端,因此才会给这个js文件起名为server.js
。
当然node.js自己本身也可以作为一个父进程来创建更多子进程:
import {spawn} from 'child_process'
// 创建子进程
const serverProcess = spawn('node',['server.js']) //启动node应用程序,参数是'server.js'
{
'jsonrpc': '2.0', //版本
'method': 'sum', //方法
'params': { //参数
"a": 5,
"b": 6
},
'id': 1 //标记
}
{
'jsonrpc': '2.0', //版本
'result': 11,
'id': 1
}
这边从server.js这边写一个测试:
import utils from './utils.js'
process.stdin.on('data',(data)=>{
const req = JSON.parse(data)
const funcName = req.method
const params = req.params
const result = utils[funcName](params)
const res = {
'jsonrpc': '2.0',
'result': result,
'id': req.id
}
})
这些通信,主要是补充了某一些进程功能上的不足。