用于本地和远程进程间通信的 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。因此,当世界使用它时,我们无法绑定到 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 许可证文件。
对不起。