分場景講解兩個 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 套接字(socket)是一种基于 TCP/IP 协议的通信方式,可以让通过网络连接的计算机上的进程进行通信。一个作为 server 另一个作为 client,server.js 代码如下:
const net = require('net') const server = net.createServer(socket => { console.log('socket connected') 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(data) 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(msg) }, 3000)
运行效果:
$ node server.js client connected receive: hello send: hello $ node client.js connect to server send: hello receive: hello
使用 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') const options = { hostname: '192.168.10.105', port: 8888, path: '/hello', method: 'GET', } const req = http.request(options, res => { console.log(`statusCode: ${res.statusCode}`) res.on('data', d => process.stdout.write(d)) }) req.on('error', error => console.error(error)) req.end()
运行效果:
$ node server.js url /hello $ node client.js statusCode: 200 hello
同一台电脑上两个 Node.js 进程间通信
虽然网络 socket 也可用于同一台主机的进程间通讯(通过 loopback 地址 127.0.0.1),但是这种方式需要经过网络协议栈、需要打包拆包、计算校验和、维护序号和应答等,就是为网络通讯设计的,而同一台电脑上的两个进程可以有更高效的通信方式,即 IPC(Inter-Process Communication),在 unix 上具体的实现方式为 unix domain socket,这是服务器端和客户端之间通过本地打开的套接字文件进行通信的一种方法,与 TCP 通信不同,通信时指定本地文件,因此不进行域解析和外部通信,所以比 TCP 快,在同一台主机的传输速度是 TCP 的两倍。
使用内置 IPC 通道
如果是跟自己创建的子进程通信,是非常方便的,child_process 模块中的 fork 方法自带通信机制,无需关注底层细节,例如父进程 parent.js 代码:
const fork = require("child_process").fork const path = require("path") const child = fork(path.resolve("child.js"), [], { stdio: "inherit" }); child.on("message", (message) => { console.log("message from child:", message) child.send("hi") })
子进程 child.js 代码:
process.on("message", (message) => { console.log("message from parent:", message); }) if (process.send) { setInterval(() => process.send("hello"), 3000) }
运行效果如下:
$ node parent.js message from child: hello message from parent: hi message from child: hello message from parent: hi
使用自定义管道
如果是两个独立的 Node.js 进程,如何建立通信通道呢?在 Windows 上可以使用命名管道(Named PIPE),在 unix 上可以使用 unix domain socket,也是一个作为 server,另外一个作为 client,其中 server.js 代码如下:
const net = require('net') const fs = require('fs') const pipeFile = process.platform === 'win32' ? '\\\\.\\pipe\\mypip' : '/tmp/unix.sock' const server = net.createServer(connection => { console.log('socket connected.') connection.on('close', () => console.log('disconnected.')) connection.on('data', data => { console.log(`receive: ${data}`) connection.write(data) console.log(`send: ${data}`) }) connection.on('error', err => console.error(err.message)) }) try { fs.unlinkSync(pipeFile) } catch (error) {} server.listen(pipeFile)
client.js 代码如下:
const net = require('net') const pipeFile = process.platform === 'win32' ? '\\\\.\\pipe\\mypip' : '/tmp/unix.sock' const client = net.connect(pipeFile) 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(msg) }, 3000)
运行效果:
$ node server.js socket connected. receive: hello send: hello $ node client.js connected. send: hello receive: hello
更多编程相关知识,请访问:编程入门!!
以上是分場景講解兩個 Node.js 進程間如何進行通訊!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

explorer.exe是什麼進程在我們使用Windows作業系統的時候,常常會聽到一個名詞"explorer.exe".那麼,你是否好奇這個進程到底是什麼?在本文中,我們將詳細解釋explorer.exe是什麼進程以及其功能和作用。首先,explorer.exe是Windows作業系統的關鍵流程,它負責管理和控制Windows資源管理器(Window

ccsvchst.exe是一種常見的進程文件,它是SymantecEndpointProtection(SEP)軟體的一部分,而SEP則是一款由著名的網路安全公司Symantec開發的終端保護解決方案。作為該軟體的一部分,ccsvchst.exe負責管理和監控SEP的相關進程。首先,我們來了解SymantecEndpointProtection(

上篇文章(連結),小棗君向大家介紹了寬頻技術從ISDN、xDSL到10GPON的發展歷程。今天,我們來聊聊即將到來的新一代光纖寬頻技術—50GPON。 █F5G和F5G-A介紹50GPON之前,先來談談F5G和F5G-A。 2020年2月,ETSI(歐洲電信標準化協會)推進了一套以10GPON+FTTR、Wi-Fi6、200G光傳送/匯聚、OXC等技術為基礎的固定通訊網路技術體系,並將其命名為F5G,也就是第五代固網通訊技術(The5thgenerationFixednetworks)。 F5G是固網

在Linux系統中,殭屍行程是已經終止但仍保留在系統中的特殊流程。雖然殭屍行程不會消耗太多資源,但如果數量太多,可能會導致系統資源耗盡。本文將介紹如何正確清除殭屍進程,以確保系統的正常運作。 1Linux殭屍行程子程序完成任務後,如果父行程沒有及時檢查狀態,子行程將成為殭屍行程。子進程在等待父進程確認,完成後系統才會回收。否則,殭屍行程會繼續懸掛在系統中。若要檢查系統中是否有殭屍進程,可透過執行命令top來查看所有正在執行的進程及可能存在的殭屍進程。 ‘top’指令的結果從上圖可以看到Linux中進

Linux程序優先級調整方法詳解在Linux系統中,進程的優先順序決定了其在系統中的執行順序和資源分配。合理調整進程的優先順序可以提高系統的效能和效率。本文將詳細介紹Linux中如何調整進程的優先級,並提供具體的程式碼範例。一、進程優先權概述在Linux系統中,每個行程都有一個與之相關聯的優先權。優先權的範圍一般是-20到19,其中-20表示最高優先權,19表

為什麼Linux中的行程會處於休眠狀態?在Linux作業系統中,進程可能會處於休眠狀態,這是由於多種不同的原因和條件造成的。當進程處於休眠狀態時,表示該進程暫時被掛起,無法繼續執行,直到滿足某種條件後才能被喚醒繼續執行。接下來將詳細介紹在Linux中進程進入休眠狀態的幾種常見情況,並透過具體的程式碼範例加以說明。等待I/O完成:當進程發起一個I/O操作(例如讀取

在現今這個數位時代,寬頻已經成為我們每個人、每個家庭的生活必需品。如果沒有它,我們會坐立難安、心緒不寧。那麼,你知道寬頻背後的技術原理嗎?從最早期的56k「貓」撥號,到現在的千兆城市、千兆家庭,我們的寬頻科技到底經歷了怎樣的改變?今天這篇文章,我們就來詳細了解一下—「寬頻的故事」。 █xDSL和ISDN下面這個介面,你看過嗎?我相信很多70後80後的小夥伴,肯定見過,非常熟悉。沒錯,這就是當年我們最初接觸網路時,進行「撥接上網」的介面。那還是20多年前,小棗君還在上大學的時候。為了上網,我

原文標題:《無線滑鼠到底是怎麼做到無線的? 》無線滑鼠慢慢成了現在辦公電腦的標配,從此再也不用拖著長長的線跑來跑去了。可是,無線滑鼠是怎麼運作的呢?今天我們一起來學習No.1無線滑鼠的發展史你知道嗎,無線滑鼠現在也已經40歲了,1984年的時候,羅技研製了世界上第一款無線滑鼠,不過這個無線滑鼠採用紅外線作為訊號的載體,據說長得像下面圖片這個樣子,後面因為效能原因而宣告失敗。直到十年後的1994年,羅技終於研發成功了一個工作在27MHz的無線滑鼠,這個27MHz頻率也成了很長一段時間內,無線滑鼠
