node.js使用 Unix domain socket进行IPC通讯

2024-01-18 11:16:30 浏览数 (2)

Unix domain socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信。socket 原本是为网络通讯设计的,但后来在 socket 的框架上发展出一种 IPC 机制,就是 UNIX domain socket。虽然网络 socket 也可用于同一台主机的进程间通讯(通过 loopback 地址 127.0.0.1),但是 UNIX domain socket 用于 IPC 更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。这是因为,IPC 机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。

UNIX domain socket 是全双工的,API 接口语义丰富,相比其它 IPC 机制有明显的优越性,目前已成为使用最广泛的 IPC 机制,比如 X Window 服务器和 GUI 程序之间就是通过 UNIX domain socket 通讯的。Unix domain socket 是 POSIX 标准中的一个组件,所以不要被名字迷惑,linux 系统也是支持它的。

了解Docker的同学应该知道Docker daemon监听一个docker.sock文件,这个docker.sock文件的默认路径是/var/run/docker.sock,这个Socket就是一个Unix domain socket。

node echo服务器server.js

代码语言:javascript复制
const net = require('net');
const server = net.createServer((c) => {
  // 'connection' listener.
  console.log('client connected');
  c.on('end', () => {
    console.log('client disconnected');
  });
  c.write('hellorn');
  c.pipe(c);
});
server.on('error', (err) => {
  throw err;
});
server.listen('/tmp/echo.sock', () => {
  console.log('server bound');
});

客户端client.js

代码语言:javascript复制
const net = require('net');
const client = net.createConnection({ path: '/tmp/echo.sock' }, () => {
  // 'connect' listener.
  console.log('connected to server!');
  client.write('world!rn');
});
client.on('data', (data) => {
  console.log("server:" data.toString());
  client.end();
});
client.on('end', () => {
  console.log('disconnected from server');
}); 

0 人点赞