@achrinza/node-ipc 页面存档备份,存于互联网档案馆
注: 这是一个维护叉
node-ipc这是用来 直接或间接依赖的软件包node-ipc维护者 需要换人.见 https://github.com/achrinza/node-ipc/issues/1 (中文(简体) ) 更多细节.
用于本地和远程进程间通信的节点js模块 并全力支持Linux,Mac和Windows. 它还支持从低等unix和窗口套接字到UDP以及安全TLS和TCP套接字的一切形式的套接字通信.
复杂多进程的巨大解决方案 神经网络建设 在节点JS
npm 安装 @achrinza/ node- ipc
旧节点版本
最新版本 @achrinza/node-ipc 可能与和谐旗合作。 官方支持节点v4 以及更新的es5和es6
测试
npm test 将用 istanbul 为@achrinza/node-ipc 进行茉莉花测试,并在光谱文件夹中生成覆盖报告.
您可能想要在全球安装 Jasmine 和 Istanbul sudo npm install -g jasmine istanbul
目录
IPC 袜子类型
| 类型 | 稳定 | 定义 |
|---|---|---|
| 取消 套接字或 Windows 套接字 | 稳定 | 给予Linux,Mac,和Windows闪电快速通信,并避免网络卡来减少间接费用和延迟. 本地 Unix 和 Windows 套接字示例 |
| TCP 套接字 | 稳定 | 给整个网络提供最可靠的通信. 也可以用于本地的 IPC,但是比#1的Unix Socket 执行慢了,因为TCP sockets通过网络卡,而Unix Sockets和Windows Sockets则不通过. 本地或远程网络 TCP 套接字示例 |
| TLS 套接字 | 稳定 | 在SSL上方可配置和安全的网络套接字 。 等同为https. TLS/SSL 文档 |
| UDP 袜子 | 稳定 | 给它 网络通信速度最快. UDP不可靠,但比TCP快得多. 它最好用于流出非关键数据,如声音,视频,或多人游戏数据,因为它可以根据网络连接和其他因素降下数据包. UDP也可以用于本地的 IPC,但比#1的Unix Socket或Windows Socket执行慢,因为UDP套接字通过网络卡,而Unix和Windows Sockets则不使用. 本地或远程网络 UDP 套接字示例 |
| 监督办 | 支持的袜子 |
|---|---|
| 链接 | Unix, Posix, TCP, TLS, UDP |
| 麦克 | Unix, Posix, TCP, TLS, UDP |
| 赢 | 视窗、 TCP、 TLS、 UDP |
IPC 配置
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 路径, 用于创建或绑定 。 这是可用的, 以防系统运行的应用程序很多, 您可能有多个带有相同 ID 的套接字, 但如果您更改了应用空间, 您仍将有 app special 独有的套接字 . |
| 套接字 | 要创建或绑定 Unix 套接字的目录 |
| 编号 | 此套接字或服务的 id |
| 网络热点 | tCP、 TLS 或 UDP Sockets 应连接的本地或远程主机 |
| 网络端口 | tCP、 TLS 或 UDP 套接字应该连接的默认端口 |
| 可读全部 | 使管道可以为所有用户读取,包括窗口服务 |
| 可写全部 | 使管道可以为所有用户写入,包括窗口服务 |
| 编码 | 在套接字上发送数据的默认编码。 当原始缓冲器设置为真实时主要使用. 有效值为: ascii utf8 utf16le ucs2 base64 hex 。 。 。 . |
| 原始缓冲 | 如果数据属实, 数据将作为原始节点发送和接收 Buffer 没有 a 一个 Object 作为JSON。 这对二进制或六进制 IPC 和以 C 和 C++ 等语言与其他进程进行交流都有好处 |
| 分隔符 | 每个数据包末尾的分隔符. |
| 同步 | 同步请求 。 客户端在服务器回复前不会发送新请求 . |
| 无声 | 打开/ 关闭日志默认为虚假, 这意味着日志已启动 |
| 登录颜色 | 打开/关闭 util. 检查 ipc.log 的颜色 |
| 日志深度 | 设置 util 的深度。 在 ipc.log 期间检查 |
| 日志 | 接收 ipc.log 输出的函数; 应采用单一字符串参数 |
| 最大连接 | 这是允许到套接字的最大连接数 。 它目前仅被设定在Unix Sockets上. 其他 Socket 类型正在使用系统默认. |
| 重试 | 如果连接丢失, 客户端将会在尝试重新连接到服务器之前等待, 时间为毫秒 。 这不会影响UDP套接字,因为它们没有Unix Sockets和TCP Sockets这样的客户端服务器关系. |
| 最大存储量 | 如果设置, 它代表每次断开后的最大重试次数, 然后放弃并完全杀死一个特定的连接 |
| 停止重试 | 默认为虚假含义的客户端将继续重试,以便在重试间隔时无限期地连接到服务器. 如果设定为任意数字, 每次断开后, 客户端都会停止重试 。 如果实时设定为真实, 它将立即停止尝试连接, 不论最大版本 。 如果设置为 0, 客户端会 没有 尝试重新连接 . |
| 取消链接 | 默认为真实意味着模块会在启动前处理删除 IPC 套接字 。 如果您使用 @achrinza/node-ipc 在一个组合环境中,在同一套接字上会有多个听众,您必须设置到 false 然后注意删除您代码中的套接字. |
| 接口 | 主要用于指定客户端应连接的接口. 见 socket.connect 文档在节点.js api |
IPC 方法
这些方法见《国际刑法》的范围.
日志
ipc.log(a,b,c,d,e...);
ipc.log 将接受任何数量的论点,如果 ipc.config.silent 尚未设置,它会把它们都挤出一个 " 空格 " ,然后登录到控制台。 这是快速的,因为它阻止了任何凝结 如果ipc.config。 安静 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 Sockets和Windows Sockets的客户端. 这是在同一台机器上进行交流的最快方式 因为它绕过TCP和UDP必须同时使用的网络卡.
| 变量 | 所需经费 | 定义 |
|---|---|---|
| 编号 | 所需经费 | 是连接到的套接字的字符串 ID。 创建时, 将带有此标识的套接字添加到对象的 ipc. |
| 路径 | 选项 | 是 Unix 域名套接字文件的路径,如果系统是 Windows ,则将自动转换为适当的管子,其信息与 Unix 域名套接字文件相同。 如果不设定, 则默认为 ipc.config.socketRoot+ 键ipc.config.appspace+ 键id |
| 回调 | 选项 | 这是创建套接字时要执行的功能 . |
实例 只要这些论点还处于秩序状态,就可以予以排除.
ipc.connectTo("world");
或者只使用身份和回调
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 套接字 通过网络卡。 它可以是本地或远程的, 如果是本地的, 建议您使用 Unix 和 Windows Socket 执行 connectTo 因为它比网络卡要快得多.
对于 TLS 和 SSL Sockets ,请参看 @achrinza/node-ipc TLS和SSL 文件他们有一些额外的要求, 事情要知道, 也有自己的医生.
| 变量 | 所需经费 | 定义 |
|---|---|---|
| 编号 | 所需经费 | 是连接到的套接字的字符串 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");
或者只使用身份和回调
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. |
实例
ipc.disconnect("world");
服务
ipc.serve(path,callback);
曾经创建本地的Unix Socket服务器或Windows Socket服务器,客户端可以与之绑定. 服务器可以 emit 对特定客户端 Sockets 的事件,或 broadcast 所有已知客户Sockets的事件.
| 变量 | 所需经费 | 定义 |
|---|---|---|
| 路径 | 选项 | 这是Unix Domain Socket文件的路径,如果系统是Windows,这将自动被转换成一个与Unix Domain Socket文件相同信息的适当管. 如果不设定, 则默认为 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 Socket服务器,客户端可以绑定,其他服务器也可以将数据发送到. 服务器可以 emit 对特定客户端 Sockets 的事件,或 broadcast 所有已知客户Sockets的事件.
| 变量 | 所需经费 | 定义 |
|---|---|---|
| 东道主 | 选项 | 如果在 os.networkInterfaces () 中未指定此默认地址 。 对于 TCP 、 TLS 和 UDP 服务器, 这很可能是 127. 0.0.1 或 * 1 |
| 端口 | 选项 | TCP、 UDP 或 TLS Socket 服务器将受约束的端口, 如果未指定, 默认为 8000 |
| UDPTYP 软件 | 选项 | 如果设置此选项将创建服务器为 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 存储和默认变量
| 变量 | 定义 |
|---|---|
| 邮编 | 连接用户时, 套接字的重置会存放于此 ipc.connectTo 或者说 iupc.connectToNet。它们将根据用于创建它们的ID存储,例如: ipc.of.mySocket |
| ipc.服务器 | 这是对由 ipc.serve 或者说 ipc.serveNet |
IPC 服务器方法
| 方法 | 定义 |
|---|---|
| 开始 | 开始服务需要呼叫 serve 或者说 serveNet 首先设置服务器 |
| 停下来 | 关闭服务器并停止服务 |
IPC 活动
| 事件名称 | 段落 | 定义 |
|---|---|---|
| 错误 | 错误obj | 发生错误时触发 |
| 连接 | 连接套接字时触发 | |
| 断开 | 当套接字与服务器断开时由客户端触发 | |
| 套接字. 已断开 | 套接字已销毁 SocketID | 当客户端套接字断开时由服务器触发 |
| 销毁 | 当套接字被完全销毁时, 不再进行自动重试, 所有引用都消失 . | |
| 数据 | 缓冲 | 当 ipc.config.rawBuffer 属实并收到消息时触发. |
| 您的事件类型 | 您的事件数据 | 当收到 JSON 消息时触发 。 事件名称将是您信件中的类型字符串, 参数将是您信件中的数据对象 : { type:'myEvent',data:{a:1}} |
多个IPC实例
有时你可能需要明确而独立的 @achrinza/node-ipc。 仅针对这些情景,我们已经暴露了IPC单子的核心IPC类.
const RawIPC = require("@achrinza/node-ipc").IPC;
const ipc = new RawIPC();
const someOtherExplicitIPC = new RawIPC();
//OR
const ipc = require("@achrinza/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";
基本实例
你们可以找到 高级示例 在示例文件夹中。 在示例中,您将找到更复杂的演示,包括多个客户端实例.
Unix Sockets、 Windows Sockets 和 TCP Sockets 服务器
服务器是保存 IPC 的套接字的程序 。 多个套接字可以连接到这个服务器并与之交谈. 它还可以对所有客户进行广播,也可以向特定客户发送. 这是当地Unix和Windows Sockets以及当地或远程网络TCP Sockets最基本的例子.
var ipc = require("@achrinza/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 Sockets & TCP Sockets 客户端
该客户端连接到服务器套接字,用于进程间通信. 该套接字将接收向它具体发送的事件以及服务器在套接字上广播的事件。 这是对本地Unix Sockets和本地或远程网络TCP Sockets都有用的最基本的例子.
var ipc = require("@achrinza/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 Sockets 的服务器客户端( C)
UDP 服务器 Sockets与Unix,Windows & TCP Sockets不同,因为它们必须被捆绑到自己机器上一个独特的端口来接收消息. 例如,一个TCP,Unix,或Windows Socket客户端可以仅仅连接到一个单独的TCP,Unix,或Windows Socket断接. 然后,该客户端可以交换服务器端口或位置上的数据,无论是发送还是接收。 UDP 服务器 袜子不能这样做。 它们必须绑定在港口接收或发送数据.
这意味着一个UDP客户端和服务器是同一事物,因为为了接收数据,一个UDP Socket必须拥有自己的端口才能接收数据,而且每次只有一个过程可以使用这个端口. 这也意味着为了 emit 或者说 broadcast 数据 UDP 服务器需要知道它打算将数据广播到的 Socket 的主机和端口.
这是当地和偏远的UDP Sockets最基本的例子.
UDP 服务器 1 - "世界"
var ipc = require("../../../@achrinza/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();
UDP 服务器 2 - "你好"
说明 我们把这里的端口设置为8001,因为世界服务器已经使用默认的 ipc.config.networkPort of 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();
Raw 缓冲或 二进制袜子
二进制或缓冲套接字可用于上述任何套接字类型,但数据事件释放的方式 一点点 不一样 如果与嵌入式系统或C/C++进程合作,这些可能是有益的。 甚至可以确保匹配 C 或 C++ 字符串打入.
当设置原始缓冲套接器时, 您必须指定它 :
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]);
在连接到 C 或 C++ 进程或嵌入式系统时,将明确的缓冲器,内置型号,双相,浮相等以及大端和小端相等数据写入原始缓冲器的怀旧值(此处参见关于缓冲器的更详细信息以及UInt,内置,双相等)[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 模块
@achrinza/node-ipc 可用节点.js' 集群模块 以提供拥有多个读取器用于单个套接字的能力。 这样做只需要你设置 unlink 属性 false 并注意在主进程中解开套接字路径:
服务器
const fs = require("fs");
const ipc = require("../../../@achrinza/node-ipc");
const cpuCount = require("os").cpus().length;
const cluster = require("cluster");
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}`);
}
客户端
const fs = require("fs");
const ipc = require("../../@achrinza/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");
});
}
麻省理工学院颁发的许可证
见 麻省理工学院许可证 文档.