用於本機和遠端進程間通訊的 Nodejs 模組,完全支援 Linux、Mac 和 Windows。它還支援所有形式的套接字通信,從低階 unix 和 windows 套接字到 UDP 和安全 TLS 和 TCP 套接字。
Node.JS 中複雜多進程神經網路的絕佳解決方案
npm install node-ipc
npm install node-ipc@^9.0.0
//es6
import ipc from 'node-ipc'
//commonjs
const ipc = require ( 'node-ipc' ) . default ;
npm info :查看 Node-ipc 的 npm 趨勢和統計信息
GitHub 資訊:
代碼覆蓋率資訊:
執行npm run coverage
以在 localhost:8080 上託管本地版本的覆蓋率報告。應該很熟悉吧。
使用 vanilla-test 完成測試vanilla-test
與 c8 整合以實現本機 ESM 覆蓋,無需轉譯程式碼。在撰寫本文時,這是本地測試 ESM 的唯一方法,而且令人驚嘆!
套餐詳情網址:
這項工作透過麻省理工學院許可證獲得許可。
最新版本的node-ipc
可以與 --harmony 標誌一起使用。不過,我們正式支援 Node v4 及更高版本的 es5 和 es6
npm test
將使用 istanbul 為 node-ipc 執行 jasmine 測試,並在 spec 資料夾中產生覆蓋率報告。
您可能想要使用sudo npm install -g jasmine istanbul
全域安裝 jasmine 和 istanbul
類型 | 穩定 | 定義 |
---|---|---|
Unix 套接字或 Windows 套接字 | 穩定的 | 為 Linux、Mac 和 Windows 提供閃電般的快速通信,並避免使用網路卡以減少開銷和延遲。本機 Unix 和 Windows 套接字範例 |
TCP套接字 | 穩定的 | 提供最可靠的網路通訊。也可用於本機 IPC,但比 #1 的 Unix Socket 實作慢,因為 TCP 套接字透過網路卡,而 Unix 套接字和 Windows 套接字則不透過網路卡。本地或遠端網路 TCP 套接字範例 |
TLS 套接字 | 穩定的 | 透過 SSL 的可設定且安全的網路套接字。相當於https。 TLS/SSL 文檔 |
UDP 套接字 | 穩定的 | 提供最快的網路通訊。 UDP 的可靠性較低,但比 TCP 快得多。它最適合用於傳輸非關鍵數據,如聲音、視訊或多人遊戲數據,因為它可能會根據網路連線和其他因素丟棄資料包。 UDP 也可用於本機 IPC,但比#1 的 Unix Socket 或 Windows Socket 實作慢,因為 UDP 套接字要經過網路卡,而 Unix 和 Windows 套接字則不然。本機或遠端網路 UDP 套接字範例 |
作業系統 | 支援的插座 |
---|---|
Linux | Unix、Posix、TCP、TLS、UDP |
蘋果 | Unix、Posix、TCP、TLS、UDP |
贏 | Windows、TCP、TLS、UDP |
ipc.config
在ipc.config
範圍中設定這些變數以覆蓋或設定預設值。
{
appspace : 'app.' ,
socketRoot : '/tmp/' ,
id : os . hostname ( ) ,
networkHost : 'localhost' , //should resolve to 127.0.0.1 or ::1 see the table below related to this
networkPort : 8000 ,
readableAll : false ,
writableAll : false ,
encoding : 'utf8' ,
rawBuffer : false ,
delimiter : 'f' ,
sync : false ,
silent : false ,
logInColor : true ,
logDepth : 5 ,
logger : console . log ,
maxConnections : 100 ,
retry : 500 ,
maxRetries : false ,
stopRetrying : false ,
unlink : true ,
interfaces : {
localAddress : false ,
localPort : false ,
family : false ,
hints : false ,
lookup : false
}
}
多變的 | 文件 |
---|---|
應用空間 | 用於 Unix Socket(Unix Domain Socket)命名空間。如果沒有特別設置,Unix Domain Socket 會結合 socketRoot、appspace 和 id 形成 Unix Socket Path 來建立或綁定。如果您的系統上運行有許多應用程序,則可以使用此功能,您可能有多個具有相同 id 的套接字,但如果更改應用程式空間,您仍將擁有應用程式特定的唯一套接字。 |
套接字根 | 建立或綁定到 Unix Socket 的目錄 |
ID | 該套接字或服務的 ID |
網路主機 | TCP、TLS 或 UDP 套接字應連接的本機或遠端主機 |
網路連接埠 | TCP、TLS 或 UDP 套接字應連接的預設連接埠 |
可讀全部 | 讓管道對所有使用者(包括 Windows 服務)都可讀 |
可寫全部 | 使管道對所有使用者(包括 Windows 服務)都是可寫入的 |
編碼 | 在套接字上發送的資料的預設編碼。主要在 rawBuffer 設定為 true 時使用。有效值為: ascii utf8 utf16le ucs2 base64 hex 。 |
原始緩衝區 | 如果為 true,資料將作為原始節點Buffer 而不是JSON Object 發送和接收。這對於二進位或十六進位 IPC 以及使用 C 和 C++ 等語言與其他進程進行通訊非常有用 |
分隔符 | 每個資料包末尾的分隔符。 |
同步 | 同步請求。在伺服器應答之前客戶端不會發送新請求。 |
沉默的 | 開啟/關閉日誌記錄預設為 false,這表示日誌記錄已開啟 |
登入顏色 | 開啟/關閉 ipc.log 的 util.inspect 顏色 |
對數深度 | 在 ipc.log 期間設定 util.inspect 的深度 |
記錄器 | 接收 ipc.log 輸出的函數;應該採用單一字串參數 |
最大連線數 | 這是套接字允許的最大連接數。目前僅在 Unix Sockets 上設定。其他 Socket 類型使用系統預設值。 |
重試 | 這是如果連線遺失,客戶端在嘗試重新連線到伺服器之前將等待的時間(以毫秒為單位)。這不會影響 UDP 套接字,因為它們不像 Unix 套接字和 TCP 套接字那樣具有客戶端伺服器關係。 |
最大重試次數 | 如果設置,則表示每次斷開連接後放棄並完全終止特定連接之前的最大重試次數 |
停止重試 | 預設為 false 表示客戶端將按照重試間隔無限期地繼續重試連線到伺服器。如果設定為任意數字,則每次斷開連線後超過該數字時用戶端將停止重試。如果即時設定為 true,無論 maxRetries 是多少,它都會立即停止嘗試連線。如果設定為 0,客戶端將不會嘗試重新連線。 |
取消連結 | 預設為 true 表示模組將在啟動之前刪除 IPC 套接字。如果您在叢集環境中使用node-ipc ,其中同一套接字上有多個偵聽器,則必須將其設為false ,然後在您自己的程式碼中刪除該套接字。 |
介面 | 主要在指定客戶端應透過哪個介面進行連線時使用。請參閱node.js api 中的socket.connect 文檔 |
這些方法在 IPC 範圍內可用。
ipc.log(a,b,c,d,e...);
ipc.log 將接受任意數量的參數,如果未設定ipc.config.silent
,它將用單個空格 ' ' 將它們全部連接起來,然後將它們記錄到控制台。這很快,因為如果 ipc.config.silent 設定為true
它可以防止任何串聯發生。這樣,如果您保留日誌記錄,它幾乎不會對效能產生影響。
日誌也使用 util.inspect 您可以透過ipc.config
控制是否應該以顏色、日誌深度和目的地進行日誌記錄
ipc . config . logInColor = true ; //default
ipc . config . logDepth = 5 ; //default
ipc . config . logger = console . log . bind ( console ) ; // default
ipc.connectTo(id,path,callback);
用於作為客戶端連接到本機 Unix 套接字和 Windows 套接字。這是同一台電腦上的進程進行通訊的最快方式,因為它繞過了 TCP 和 UDP 必須同時使用的網路卡。
多變的 | 必需的 | 定義 |
---|---|---|
ID | 必需的 | 是正在連接的套接字的字串 ID。具有此 id 的套接字在建立時會加入到 ipc.of 物件中。 |
小路 | 選修的 | 是Unix域套接字檔案的路徑,如果系統是Windows,它將自動轉換為適當的管道,其資訊與Unix域套接字檔案相同。如果未設置,則預設為ipc.config.socketRoot + ipc.config.appspace + id |
打回來 | 選修的 | 這是建立套接字時要執行的函數。 |
只要範例參數仍然按順序排列,就可以省略它們。
ipc . connectTo ( 'world' ) ;
或只使用 id 和回調
ipc . connectTo (
'world' ,
function ( ) {
ipc . of . world . on (
'hello' ,
function ( data ) {
ipc . log ( data . debug ) ;
//if data was a string, it would have the color set to the debug style applied to it
}
)
}
) ;
或明確設定路徑
ipc . connectTo (
'world' ,
'myapp.world'
) ;
或使用回調顯式設定路徑
ipc . connectTo (
'world' ,
'myapp.world' ,
function ( ) {
...
}
) ;
ipc.connectToNet(id,host,port,callback)
用於作為客戶端透過網路卡連接到 TCP 或 TLS 套接字。這可以是本地的或遠端的,如果是本地的,建議您使用connectTo
的 Unix 和 Windows Socket Implementaion,因為它完全避免了網路卡,因此速度更快。
對於 TLS 和 SSL 套接字,請參閱 node-ipc TLS 和 SSL 文件。他們有一些額外的要求和需要了解的事情,因此有自己的文件。
多變的 | 必需的 | 定義 |
---|---|---|
ID | 必需的 | 是正在連接的套接字的字串 ID。對於 TCP 和 TLS 套接字,當使用套接字引用建立套接字時,此 id 會新增至ipc.of 物件中。 |
主持人 | 選修的 | 是 TCP 或 TLS 套接字所在的主機。如果未指定,這將預設為ipc.config.networkHost 。 |
港口 | 選修的 | TCP 或 TLS 套接字所在的連接埠。 |
打回來 | 選修的 | 這是建立套接字時要執行的函數。 |
只要範例參數仍然按順序排列,就可以省略它們。
因此,雖然預設值是:(id,host,port,callback),但以下範例仍然有效,因為它們仍然按順序 (id,port,callback) 或 (id,host,callback) 或 (id,port) 等。
ipc . connectToNet ( 'world' ) ;
或只使用 id 和回調
ipc . connectToNet (
'world' ,
function ( ) {
...
}
) ;
或明確設定主機和路徑
ipc . connectToNet (
'world' ,
'myapp.com' , serve ( path , callback )
3435
) ;
或僅明確設定連接埠和回調
ipc . connectToNet (
'world' ,
3435 ,
function ( ) {
...
}
) ;
ipc.disconnect(id)
用於中斷客戶端與 Unix、Windows、TCP 或 TLS 套接字的連線。套接字及其引用將從記憶體和ipc.of
範圍中刪除。這可以是本地的或遠端的。 UDP 用戶端不維護連接,因此沒有客戶端,此方法對它們沒有任何價值。
多變的 | 必需的 | 定義 |
---|---|---|
ID | 必需的 | 是要斷開連接的套接字的字串 ID。 |
例子
ipc . disconnect ( 'world' ) ;
ipc.serve(path,callback);
用於建立用戶端可以綁定的本機 Unix Socket Server 或 Windows Socket Server。伺服器可以向特定的客戶端套接字emit
事件,或向所有已知的客戶端套接字broadcast
事件。
多變的 | 必需的 | 定義 |
---|---|---|
小路 | 選修的 | 這是Unix域套接字檔案的路徑,如果系統是Windows,它將自動轉換為適當的管道,其資訊與Unix域套接字檔案相同。如果未設置,則預設為ipc.config.socketRoot + ipc.config.appspace + id |
打回來 | 選修的 | 這是伺服器啟動後呼叫的函數。這也可以透過將事件綁定到啟動事件來完成,例如ipc.server.on('start',function(){}); |
只要參數仍然按順序排列,範例參數就可以被省略。
ipc . serve ( ) ;
或指定回調
ipc . serve (
function ( ) { ... }
) ;
或指定路徑
ipc . serve (
'/tmp/myapp.myservice'
) ;
或指定一切
ipc . serve (
'/tmp/myapp.myservice' ,
function ( ) { ... }
) ;
serveNet(host,port,UDPType,callback)
用於建立客戶端可以綁定或其他伺服器可以向其發送資料的 TCP、TLS 或 UDP 套接字伺服器。伺服器可以向特定的客戶端套接字emit
事件,或向所有已知的客戶端套接字broadcast
事件。
多變的 | 必需的 | 定義 |
---|---|---|
主持人 | 選修的 | 如果未指定,則預設為 os.networkInterfaces() 中的第一個位址。對於 TCP、TLS 和 UDP 伺服器,這很可能是 127.0.0.1 或 ::1 |
港口 | 選修的 | TCP、UDP 或 TLS 套接字伺服器將綁定的端口,如果未指定,則預設為 8000 |
UDP類型 | 選修的 | 如果設定此選項,則會將伺服器建立為 UDP 套接字。 “udp4”或“udp6”是有效值。預設不設定。使用 udp6 時,請確保指定有效的 IPv6 主機,例如::1 |
打回來 | 選修的 | 創建伺服器時呼叫的函數 |
範例參數可以被省略,只要它們仍然按順序排列即可。
預設 TCP 伺服器
ipc . serveNet ( ) ;
預設 udp 伺服器
ipc . serveNet ( 'udp4' ) ;
或透過回調指定 TCP 伺服器
ipc . serveNet (
function ( ) { ... }
) ;
或透過回調指定 UDP 伺服器
ipc . serveNet (
'udp4' ,
function ( ) { ... }
) ;
或指定連接埠
ipc . serveNet (
3435
) ;
或指定所有 TCP
ipc . serveNet (
'MyMostAwesomeApp.com' ,
3435 ,
function ( ) { ... }
) ;
或指定所有 UDP
ipc . serveNet (
'MyMostAwesomeApp.com' ,
3435 ,
'udp4' ,
function ( ) { ... }
) ;
多變的 | 定義 |
---|---|
ipc.of | 這是當透過ipc.connectTo 或iupc.connectToNet 作為客戶端連接到套接字連接引用時將儲存套接字連接引用的位置。它們將根據用於建立它們的 ID 進行存儲,例如:ipc.of.mySocket |
ipc伺服器 | 這是對ipc.serve 或ipc.serveNet 所建立的伺服器的引用 |
方法 | 定義 |
---|---|
開始 | 開始服務需要先呼叫serve 或serveNet 來設定伺服器 |
停止 | 關閉伺服器並停止服務 |
活動名稱 | 參數 | 定義 |
---|---|---|
錯誤 | 錯誤對象 | 發生錯誤時觸發 |
連接 | 當套接字連接時觸發 | |
斷開 | 當套接字與伺服器斷開連線時由客戶端觸發 | |
套接字斷開連接 | 套接字被破壞SocketID | 當客戶端套接字斷開連線時由伺服器觸發 |
破壞 | 當套接字完全銷毀時觸發,不會再發生自動重試並且所有參考都消失了。 | |
數據 | 緩衝 | 當 ipc.config.rawBuffer 為 true 並且收到訊息時觸發。 |
您的活動類型 | 您的活動數據 | 當收到 JSON 訊息時觸發。事件名稱將是訊息中的類型字串,參數將是訊息中的資料對象,例如: { type:'myEvent',data:{a:1}} |
有時您可能需要明確且獨立的 node-ipc 執行個體。正是針對這樣的場景,我們在 IPC 單例上公開了核心 IPC 類別。
import { IPCModule } from 'node-ipc' ;
const ipc = new RawIPC ;
const someOtherExplicitIPC = new RawIPC ;
//OR
const ipc = from 'node-ipc' ) ;
const someOtherExplicitIPC = new ipc . IPC ;
//setting explicit configs
//keep one silent and the other verbose
ipc . config . silent = true ;
someOtherExplicitIPC . config . silent = true ;
//make one a raw binary and the other json based ipc
ipc . config . rawBuffer = false ;
someOtherExplicitIPC . config . rawBuffer = true ;
someOtherExplicitIPC . config . encoding = 'hex' ;
您可以在範例資料夾中找到高級範例。在範例中,您將找到更複雜的演示,包括多個客戶端範例。
伺服器是保持 IPC 套接字開啟的進程。多個套接字可以連接到該伺服器並與之通訊。它還可以向所有客戶端廣播或向特定客戶端發送。這是最基本的範例,適用於本機 Unix 和 Windows 套接字以及本機或遠端網路 TCP 套接字。
import ipc from 'node-ipc' ;
ipc . config . id = 'world' ;
ipc . config . retry = 1500 ;
ipc . serve (
function ( ) {
ipc . server . on (
'message' ,
function ( data , socket ) {
ipc . log ( 'got a message : ' . debug , data ) ;
ipc . server . emit (
socket ,
'message' , //this can be anything you want so long as
//your client knows.
data + ' world!'
) ;
}
) ;
ipc . server . on (
'socket.disconnected' ,
function ( socket , destroyedSocketID ) {
ipc . log ( 'client ' + destroyedSocketID + ' has disconnected!' ) ;
}
) ;
}
) ;
ipc . server . start ( ) ;
客戶端連接到伺服器套接字以進行進程間通訊。套接字將接收專門向其發出的事件以及伺服器在套接字上廣播的事件。這是最基本的範例,適用於本機 Unix 套接字和本機或遠端網路 TCP 套接字。
import ipc from 'node-ipc' ;
ipc . config . id = 'hello' ;
ipc . config . retry = 1500 ;
ipc . connectTo (
'world' ,
function ( ) {
ipc . of . world . on (
'connect' ,
function ( ) {
ipc . log ( '## connected to world ##' . rainbow , ipc . config . delay ) ;
ipc . of . world . emit (
'message' , //any event or message type your server listens for
'hello'
)
}
) ;
ipc . of . world . on (
'disconnect' ,
function ( ) {
ipc . log ( 'disconnected from world' . notice ) ;
}
) ;
ipc . of . world . on (
'message' , //any event or message type your server listens for
function ( data ) {
ipc . log ( 'got a message from world : ' . debug , data ) ;
}
) ;
}
) ;
UDP 套接字與 Unix、Windows 和 TCP 套接字不同,因為它們必須綁定到電腦上的唯一連接埠才能接收訊息。例如,TCP、Unix 或 Windows Socket 用戶端只能連接到單獨的 TCP、Unix 或 Windows Socket 伺服器。然後,該客戶端可以在伺服器連接埠或位置上交換(發送和接收)資料。 UDP 套接字無法做到這一點。它們必須綁定到連接埠才能接收或發送資料。
這意味著 UDP 用戶端和伺服器是同一回事,因為為了接收數據,UDP 套接字必須有自己的連接埠來接收數據,並且一次只有一個進程可以使用該連接埠。這也意味著為了emit
或broadcast
數據,UDP 伺服器需要知道它打算將數據廣播到的 Socket 的主機和連接埠。
這是最基本的範例,適用於本機和遠端 UDP 套接字。
import ipc from 'node-ipc' ;
ipc . config . id = 'world' ;
ipc . config . retry = 1500 ;
ipc . serveNet (
'udp4' ,
function ( ) {
console . log ( 123 ) ;
ipc . server . on (
'message' ,
function ( data , socket ) {
ipc . log ( 'got a message from ' . debug , data . from . variable , ' : ' . debug , data . message . variable ) ;
ipc . server . emit (
socket ,
'message' ,
{
from : ipc . config . id ,
message : data . message + ' world!'
}
) ;
}
) ;
console . log ( ipc . server ) ;
}
) ;
ipc . server . start ( ) ;
請注意,我們將此處的連接埠設定為 8001,因為世界伺服器已經使用預設的 ipc.config.networkPort 8000。
ipc . config . id = 'hello' ;
ipc . config . retry = 1500 ;
ipc . serveNet (
8001 ,
'udp4' ,
function ( ) {
ipc . server . on (
'message' ,
function ( data ) {
ipc . log ( 'got Data' ) ;
ipc . log ( 'got a message from ' . debug , data . from . variable , ' : ' . debug , data . message . variable ) ;
}
) ;
ipc . server . emit (
{
address : '127.0.0.1' , //any hostname will work
port : ipc . config . networkPort
} ,
'message' ,
{
from : ipc . config . id ,
message : 'Hello'
}
) ;
}
) ;
ipc . server . start ( ) ;
二進位或緩衝區套接字可與上述任何套接字類型一起使用,但發出資料事件的方式略有不同。如果使用嵌入式系統或 C/C++ 進程,這些可能會派上用場。您甚至可以確保匹配 C 或 C++ 字串類型。
設定 rawBuffer 套接字時,您必須這樣指定:
ipc . config . rawBuffer = true ;
您也可以指定其編碼類型。預設是utf8
ipc . config . encoding = 'utf8' ;
發出字串緩衝區:
//server
ipc . server . emit (
socket ,
'hello'
) ;
//client
ipc . of . world . emit (
'hello'
)
發出位元組數組緩衝區:
//hex encoding may work best for this.
ipc . config . encoding = 'hex' ;
//server
ipc . server . emit (
socket ,
[ 10 , 20 , 30 ]
) ;
//client
ipc . server . emit (
[ 10 , 20 , 30 ]
) ;
發出二進位或十六進位數組緩衝區,這最適合即時資料傳輸,特別是在連接到 C 或 C++ 進程或嵌入式系統時:
ipc . config . encoding = 'hex' ;
//server
ipc . server . emit (
socket ,
[ 0x05 , 0x6d , 0x5c ]
) ;
//client
ipc . server . emit (
[ 0x05 , 0x6d , 0x5c ]
) ;
將顯式緩衝區、int 類型、雙精度、浮點數等以及大端和小端資料寫入原始緩衝區在連接到C 或C++ 進程或嵌入式系統時非常有價值(請參閱有關緩衝區以及UInt 、Int 的更多詳細資訊) ,雙等)[https://nodejs.org/api/buffer.html]:
ipc . config . encoding = 'hex' ;
//make a 6 byte buffer for example
const myBuffer = Buffer . alloc ( 6 ) . fill ( 0 ) ;
//fill the first 2 bytes with a 16 bit (2 byte) short unsigned int
//write a UInt16 (2 byte or short) as Big Endian
myBuffer . writeUInt16BE (
2 , //value to write
0 //offset in bytes
) ;
//OR
myBuffer . writeUInt16LE ( 0x2 , 0 ) ;
//OR
myBuffer . writeUInt16LE ( 0x02 , 0 ) ;
//fill the remaining 4 bytes with a 32 bit (4 byte) long unsigned int
//write a UInt32 (4 byte or long) as Big Endian
myBuffer . writeUInt32BE (
16772812 , //value to write
2 //offset in bytes
) ;
//OR
myBuffer . writeUInt32BE ( 0xffeecc , 0 )
//server
ipc . server . emit (
socket ,
myBuffer
) ;
//client
ipc . server . emit (
myBuffer
) ;
cluster
模組的伺服器node-ipc
可以與 Node.js 的 cluster 模組一起使用,為單一套接字提供多個讀取器的能力。這樣做只需要您將配置中的unlink
屬性設為false
並負責取消主進程中套接字路徑的連結:
import fs from 'fs' ;
import ipc from 'node-ipc' ;
import { cpus } from 'os' ;
import cluster from 'cluster' ;
const cpuCount = cpus ( ) . length ;
const socketPath = '/tmp/ipc.sock' ;
ipc . config . unlink = false ;
if ( cluster . isMaster ) {
if ( fs . existsSync ( socketPath ) ) {
fs . unlinkSync ( socketPath ) ;
}
for ( let i = 0 ; i < cpuCount ; i ++ ) {
cluster . fork ( ) ;
}
} else {
ipc . serve (
socketPath ,
function ( ) {
ipc . server . on (
'currentDate' ,
function ( data , socket ) {
console . log ( `pid ${ process . pid } got: ` , data ) ;
}
) ;
}
) ;
ipc . server . start ( ) ;
console . log ( `pid ${ process . pid } listening on ${ socketPath } ` ) ;
}
import fs from 'fs' ;
import ipc from 'node-ipc' ;
const socketPath = '/tmp/ipc.sock' ;
//loop forever so you can see the pid of the cluster sever change in the logs
setInterval (
function ( ) {
ipc . connectTo (
'world' ,
socketPath ,
connecting
) ;
} ,
2000
) ;
function connecting ( socket ) {
ipc . of . world . on (
'connect' ,
function ( ) {
ipc . of . world . emit (
'currentDate' ,
{
message : new Date ( ) . toISOString ( )
}
) ;
ipc . disconnect ( 'world' ) ;
}
) ;
}
請參閱 MIT 許可證文件。
對不起。