nodejs多进程通信,
Node.js进程之间是如何通信的?下面这篇文章介绍两个Node.js进程在不同场景下通信的方法,希望对你有帮助!
node.js速度课程简介:进入学习
两个Node.js进程如何相互通信?这里有两种情况:
不同计算机上的两个Node.js进程之间的通信
同一台计算机上两个Node.js进程之间的通信
[推荐研究:《nodejs 教程》]
对于第一个场景,TCP或HTTP通常用于通信,而对于第二个场景,有两个子场景:
Node.js流程与其自己创建的Node.js子流程进行通信。
Node.js进程与其他不相关的Node.js进程进行通信。
前者可以使用内置的IPC通信通道,后者可以使用自定义管道。以下是详细介绍:
不同电脑上的两个 Node.js 进程间通信
要进行通信,我们必须首先弄清楚如何识别网络中的进程。网络层的ip地址可以唯一标识网络中的主机,而传输层的协议和端口可以唯一标识主机中的应用(进程),这样网络的进程就可以用三元组(ip地址、协议、端口)来标识。
使用 TCP 套接字
TCP套接字是一种基于TCP/IP协议的通信方法,它允许通过网络连接的计算机上的进程进行通信。一个作为服务器,另一个作为客户端,server.js代码如下:
const net=require(net )
const server=net . create server(socket={
console.log(套接字连接)
socket.on(close ,()=console . log( socket disconnected ))
socket.on(error ,err=console.error(err.message))
socket.on(data ,data={
console.log(`receive: ${data} `)
socket.write(数据)
console.log(`send: ${data} `)
})
})
Server.listen(8888)client.js代码:
const net=require(net )
const client=net.connect(8888, 192.168.10.105 )
client.on(connect ,()=console.log(connected ))
client.on(data ,data=console . log(` receive:$ { data } `))
client.on(end ,()=console.log(disconnected。))
client.on(error ,err=console.error(err.message))
setInterval(()={
const msg=hello
console.log(`send: ${msg} `)
client.write(消息)
},3000)运行效果:
$ node server.js
客户端已连接
接收:你好
发送:你好
$ node client.js
连接到服务器
发送:你好
接收:你好使用 HTTP 协议
因为HTTP协议也是基于TCP的,所以从通信的角度来说,这种方法本质上是一样的,只是封装了上层协议。Server.js代码是:
const http=require(http )
Http.createServer ((req,res)=res.end (req.url))。listen (8888) client.js代码:
const http=require(http )
常量选项={
主机名:“192.168.10.105”,
端口:8888,
路径:“/hello”,
方法:“GET”,
}
const req=http.request(options,res={
console . log(` status code:$ { RES . status code } `)
res.on(data ,d=process.stdout.write(d))
})
req.on(错误,错误=console.error(错误))
req.end()的运行效果:
$ node server.js
URL/你好
$ node client.js
状态码:200
你好
同一台电脑上两个 Node.js 进程间通信
虽然网络socket也可以用于同一主机的进程间通信(通过环回地址127.0.0.1),但是这种方式需要经过网络协议栈,打包解包,计算校验和,维护序列号,回复等。它是为网络通信而设计的,同一台计算机上的两个进程可以有更高效的通信方式。IPC(进程间通信),在unix中实现为unix域socket,是服务器和客户端通过本地打开的socket文件进行通信的方法。与TCP通信不同,通信时指定本地文件,所以不进行域解析和对外通信,所以比TCP快,在同一主机上的传输速度是TCP的两倍。
使用内置 IPC 通道
和自己创建的一个子进程交流起来非常方便。child_process模块中的fork方法有自己的通信机制,所以不需要关注底层细节,比如父进程parent.js代码:
const fork=require( child _ process )。叉
const path=require(path )
const child=fork(path。resolve( child。js ),[],{ stdio: inherit });
child.on(message ,(message)={
console.log(来自子级的消息:,消息)
child.send(hi )
})子进程儿童。射流研究…代码:
process.on(message ,(message)={
console.log(来自父级的消息:,消息);
})
if (process.send) {
setInterval(()=进程。发送(你好),3000)
}运行效果如下:
$ node parent.js
来自孩子的消息:你好
来自父母的信息:嗨
来自孩子的消息:你好
来自家长的信息:你好使用自定义管道
如果是两个独立的节点。射流研究…进程,如何建立通信通道呢?在Windows操作系统操作系统上可以使用命名管道(命名管道),在操作系统上可以使用操作系统域套接字,也是一个作为服务器,另外一个作为客户,其中server.js代码如下:
const net=require(net )
const fs=require(fs )
const管道文件=进程。平台=== win32 ?\\\\.\ \ pipe \ \ mypip :/tmp/UNIX。袜子
const server=net。创建服务器(连接={
console.log(套接字已连接。)
connection.on(close ,()=console.log(disconnected .))
connection.on(data ,data={
console.log(`receive: ${data} `)
连接.写入(数据)
console.log(`send: ${data} `)
})
connection.on(error ,err=console.error(err.message))
})
尝试{
fs.unlinkSync(管道文件)
} catch(错误){}
服务器.监听(管道文件)client.js代码如下:
const net=require(net )
const管道文件=进程。平台=== win32 ?\\\\.\ \ pipe \ \ mypip :/tmp/UNIX。袜子
const client=net.connect(管道文件)
client.on(connect ,()=console.log(connected ))
client.on(data ,data=console。日志(` receive:$ { data } `))
client.on(end ,()=console.log(disconnected .))
client.on(error ,err=console.error(err.message))
setInterval(()={
const msg=hello
console.log(`send: ${msg} `)
客户端.写入(消息)
}, 3000)运行效果:
$ node server.js
插座已连接。
接收:你好
发送:你好
$ node client.js
已连接。
发送:你好
接收:你好更多编程相关知识,请访问:编程入门!以上就是分场景讲解两个节点。射流研究…进程间如何进行通信!的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。