NodeJs-Net

 后端   小卒子   2024-09-06 10:13   148
  nodejs

Node.js 的 net 模块用于创建低层次的 TCP 或 IPC 服务器和客户端,它为 Node.js 应用提供了与操作系统网络相关的功能,可以用来处理原始套接字通信。本文将详细介绍 net 模块的所有属性、方法以及使用方式,并涵盖它的相关功能。

1. 模块引入

net 模块是 Node.js 的内置模块,因此无需安装任何额外的库,只需通过 require('net') 来引入即可。

const net = require('net');

2. TCP 服务器

2.1 net.createServer()

net.createServer() 用于创建一个 TCP 服务器对象。它接收一个回调函数,当新的连接到达时,该回调函数将被调用,并传递一个 socket 对象,代表与客户端之间的连接。

const server = net.createServer((socket) => {
  console.log('客户端连接');
  
  // 处理来自客户端的数据
  socket.on('data', (data) => {
    console.log(`客户端发送的数据: ${data}`);
  });

  // 处理客户端断开连接
  socket.on('end', () => {
    console.log('客户端断开连接');
  });

  // 向客户端发送数据
  socket.write('欢迎连接到服务器!\n');
});

2.2 server.listen()

server.listen() 启动服务器监听指定的端口和主机名。可以使用 server.listen() 来启动服务器,并开始接受连接。

server.listen(8080, '127.0.0.1', () => {
  console.log('服务器已启动,正在监听 127.0.0.1:8080');
});

也可以仅传递端口号,默认监听所有可用的网络接口。

server.listen(8080, () => {
  console.log('服务器正在监听端口 8080');
});

2.3 server.close()

server.close() 关闭服务器,停止接受新连接,并等待现有连接结束。

server.close(() => {
  console.log('服务器已关闭');
});

2.4 事件:connection, close, error

  • connection: 每当有新客户端连接时触发。
  • close: 当服务器关闭时触发。
  • error: 当发生错误时触发。
server.on('connection', (socket) => {
  console.log('新连接到达');
});

server.on('error', (err) => {
  console.error('服务器发生错误:', err);
});

3. TCP 客户端

3.1 net.connect()

net.connect()(或 net.createConnection())用于创建 TCP 客户端,并连接到指定的服务器。

const client = net.connect({ port: 8080, host: '127.0.0.1' }, () => {
  console.log('已连接到服务器');
  client.write('你好,服务器!');
});

3.2 client.write()

client.write() 用于向服务器发送数据。可以通过该方法发送字符串或缓冲区数据。

client.write('发送一些数据到服务器');

3.3 client.end()

client.end() 用于关闭与服务器的连接。可以在发送最后一条消息后调用 end(),告诉服务器不再发送任何数据。

client.end('再见,服务器');

3.4 事件:data, end, error

  • data: 每当接收到服务器的数据时触发。
  • end: 当服务器关闭连接时触发。
  • error: 当连接发生错误时触发。
client.on('data', (data) => {
  console.log(`接收到服务器数据: ${data}`);
});

client.on('end', () => {
  console.log('已断开与服务器的连接');
});

client.on('error', (err) => {
  console.error('发生错误:', err);
});

4. 套接字对象

net.Socket 对象表示与远程主机的 TCP 连接,既可用于客户端,也可用于服务器端的连接。

4.1 socket.write()

socket.write() 用于通过套接字发送数据。可以发送字符串或缓冲区数据。

socket.write('发送数据到客户端或服务器');

4.2 socket.end()

socket.end() 用于关闭套接字。可以在发送完所有数据后调用此方法。

socket.end('关闭连接并发送最后一条消息');

4.3 socket.setTimeout()

socket.setTimeout() 用于设置超时时间(以毫秒为单位)。如果在超时期间没有活动,套接字将触发 timeout 事件。

socket.setTimeout(5000); // 5 秒后触发 timeout
socket.on('timeout', () => {
  console.log('连接超时');
  socket.end();
});

4.4 事件:data, end, timeout

  • data: 每当接收到数据时触发。
  • end: 当连接结束时触发。
  • timeout: 当连接超时时触发。
socket.on('data', (data) => {
  console.log(`收到的数据: ${data}`);
});

socket.on('end', () => {
  console.log('连接已关闭');
});

socket.on('timeout', () => {
  console.log('连接超时');
});

5. IPC 通信

Node.js 的 net 模块支持 IPC (Inter-Process Communication,进程间通信),可以通过 UNIX 套接字或 Windows 命名管道进行进程间通信。

5.1 net.createServer()net.connect() 用于 IPC

创建 IPC 服务器时,使用文件路径(UNIX)或命名管道(Windows)作为地址。

// 服务器端
const server = net.createServer((socket) => {
  console.log('IPC 客户端连接');
  socket.write('欢迎到 IPC 服务器');
});
server.listen('/tmp/echo.sock'); // 在 UNIX 系统中

客户端连接到相同的路径:

// 客户端
const client = net.connect('/tmp/echo.sock', () => {
  console.log('已连接到 IPC 服务器');
  client.write('你好,IPC 服务器');
});

6. 错误处理和最佳实践

在使用 net 模块时,错误处理至关重要。确保在服务器和客户端中都添加对 error 事件的处理程序,防止未处理的异常导致应用崩溃。

server.on('error', (err) => {
  console.error('服务器发生错误:', err);
});

client.on('error', (err) => {
  console.error('客户端发生错误:', err);
});

连接恢复机制

对于客户端而言,连接到服务器失败时,可以实现重试逻辑。

function connectToServer() {
  const client = net.connect({ port: 8080 }, () => {
    console.log('已连接到服务器');
  });

  client.on('error', (err) => {
    console.error('连接失败,重试中...', err);
   

 setTimeout(connectToServer, 5000); // 5 秒后重试
  });
}

connectToServer();

7. 示例代码

TCP 服务器和客户端

服务器端

const net = require('net');

const server = net.createServer((socket) => {
  console.log('新客户端连接');
  
  socket.on('data', (data) => {
    console.log(`客户端发送的数据: ${data}`);
    socket.write('已收到');
  });

  socket.on('end', () => {
    console.log('客户端断开连接');
  });

  socket.write('欢迎连接到服务器!\n');
});

server.listen(8080, () => {
  console.log('服务器正在监听端口 8080');
});

客户端

const net = require('net');

const client = net.connect({ port: 8080 }, () => {
  console.log('已连接到服务器');
  client.write('你好,服务器!');
});

client.on('data', (data) => {
  console.log(`接收到的数据: ${data}`);
  client.end();
});

client.on('end', () => {
  console.log('已断开与服务器的连接');
});

8. 总结

net 模块是 Node.js 中用于处理 TCP 或 IPC 连接的强大工具。它提供了服务器和客户端之间的低层网络通信能力,适合处理实时数据传输、聊天室应用、流式数据传输等任务。通过结合事件驱动机制和套接字对象,开发者可以轻松构建高效的网络应用。