nodejs多进程通信,

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: