nodejs net 模块全指南

Node.js 中的 Net 模块提供了创建网络服务器和客户端的能力,促进计算机或设备之间通过互联网进行通信。无论您是要构建聊天应用程序、在系统之间传输数据还是创建网络游戏,Net 模块都是基本构建块。在本主题中,我们将探讨 Net 模块的基础知识并学习如何创建 TCP 服务器和客户端。

Working with the net module 使用网络模块

使用 Net 模块时,第一步是使用 require 语句将其包含在 Node.js 应用程序中:

const net = require('node:net');

一旦包含在内, net 对象就变得可用,提供处理网络相关任务的函数和方法。使用 Net 模块,您可以创建一个侦听传入连接的 TCP 服务器。您还可以处理从客户端接收的数据,并管理客户端断开连接。同样,您可以创建一个 TCP 客户端,它与服务器建立连接、发送数据并处理从服务器接收的数据。

Creating a TCP server 创建 TCP 服务器

导入 net 模块后,您可以使用 net.createServer() 方法创建 TCP 服务器。该方法采用回调函数作为参数,每当建立新的客户端连接时就会调用该回调函数。在此回调函数内,您可以定义服务器应如何处理客户端请求。

下面是创建 TCP 服务器的基本示例,该服务器回显从客户端接收到的任何数据:

在 server.js 中设置 TCP 服务器:

const net = require('node:net');

const server = net.createServer((client) => {
  console.log('Client connected');

  // When data is received from the client
  client.on('data', (data) => {
    console.log(`Received data from client: ${data}`);

    // Echo the received data back to the client
    client.write(data);
  });

  // When the client disconnects
  client.on('end', () => {
    console.log('Client disconnected');
  });
});

在上面的代码中,我们创建一个服务器并侦听客户端套接字上的“数据”事件。每当从客户端接收到数据时,我们都会记录接收到的数据并使用 client.write() 方法将其写回客户端。当客户端断开连接时,我们处理“结束”事件并记录一条指示断开连接的消息。

定义服务器后,您需要告诉它开始侦听传入的客户端连接。您可以通过调用 server.listen() 方法并指定您希望服务器侦听的端口号来完成此操作。这是一个例子:

让服务器监听 server.js 中的连接:

// Specify the port
const port = 3000;

// Make the server listen for connections
server.listen(port, () => {
  console.log(`Server is listening on port ${server.address().port}`);
});

在上面的代码中,net模块中的 listen 函数用于启动服务器并使其监听特定端口。 listen 函数的第一个参数指定服务器侦听传入连接的端口号。第二个参数是一个回调函数,一旦服务器开始监听,该函数就会被执行。

nodejs net 模块全指南

现在,如果您运行 Node.js 应用程序,您的 TCP 服务器将启动并侦听指定端口上的客户端连接。客户端可以使用服务器的 IP 地址和端口号与您的服务器建立连接。

Creating a TCP client 创建 TCP 客户端

.
在 Node.js 中,您可以使用 net 模块创建 TCP 客户端。该客户端通过传输控制协议(TCP)启用服务器通信。让我们探讨如何在 Node.js 中创建 TCP 客户端。

一旦网络模块可用,您就可以通过调用 net.createConnection() 方法创建 TCP 客户端。该方法将端口号和服务器地址作为参数,并返回代表连接客户端的套接字对象。

以下是创建 TCP 客户端并将其连接到服务器的示例:

const client = net.createConnection({ port: 3000, host: 'localhost' }, () => {
  console.log('Connected to server');
  
  // Send data to the server
  client.write('Hello, server!');
});

在上面的代码中,我们创建了一个 TCP 客户端,并将其连接到在 localhost(您自己的计算机)上运行的服务器的 3000 端口。一旦建立连接,就会执行回调函数,并且我们会记录一条消息来指示客户端已连接。我们还使用 client.write() 方法向服务器发送消息。

nodejs net 模块全指南

要从服务器接收数据,您可以侦听客户端套接字上的“data”事件:

client.on('data', (data) => {
  console.log(`Received data from server: ${data}`);
  
  // Close the connection after receiving data
  client.end();
});

在上面的代码中,我们监听“data”事件并记录从服务器接收到的数据。我们在收到数据后还使用 client.end() 方法关闭连接。

nodejs net 模块全指南

处理错误并在必要时正常关闭连接非常重要。您可以侦听客户端套接字上的“错误”和“结束”事件,以分别处理错误和断开连接。

当客户端断开连接时,服务器会检测到此事件并记录一条消息,指示客户端已断开连接。

nodejs net 模块全指南

通过处理这些事件,您可以确保服务器在不同场景中的行为可预测,这是构建健壮的网络应用程序的一个关键方面。

Handling errors in net modules 处理网络模块中的错误

使用 Node.js 中的 net 模块创建 TCP 服务器和客户端时,处理网络通信过程中可能发生的错误非常重要。您可能遇到的两个常见错误是 ERR_SERVER_ALREADY_LISTEN 和 EADDRINUSE 。让我们了解如何有效地处理这些错误。

ERR_SERVER_ALREADY_LISTEN :当您尝试在已被其他进程使用的端口上启动 TCP 服务器时,会发生此错误。要处理此错误,您可以使用 try...catch 块来捕获错误并提供适当的错误处理逻辑。这是一个例子:

try {
  server.listen(port, () => {
    console.log(`Server is listening on port ${port}`);
  });
} catch (error) {
  if (error.code === 'ERR_SERVER_ALREADY_LISTEN') {
    console.error('Server is already listening on the specified port');
  } else {
    console.error('An error occurred while starting the server:', error);
  }
}

在上面的代码中,我们尝试使用 server.listen() 启动服务器并捕获发生的任何错误。如果错误代码与 ERR_SERVER_ALREADY_LISTEN 匹配,我们会记录一条特定的错误消息,指示服务器已在指定端口上侦听。否则,我们会为可能发生的任何其他错误提供通用错误消息。

EADDRINUSE :当您尝试创建 TCP 客户端并连接到服务器的端口已被其他进程使用时,会发生此错误。要处理此错误,您可以在客户端套接字上侦听 ‘error’ 事件并检查错误代码是否为 'EADDRINUSE' 。这是一个例子:

server.on('error', (error) => {
  if (error.code === 'EADDRINUSE') {
    console.log('Address in use, retrying...');
    setTimeout(() => {
      server.close();
      server.listen(port, () => {
        console.log(`Server is listening on port ${port}`);
      });
    }, 1000);
  } else {
    console.error('An error occurred while starting the server:', error);
  }
});

在此代码中,服务器侦听 error 事件。当事件发生时,回调函数检查错误代码是否为 EADDRINUSE 。如果匹配,则会记录消息 Address in use, retrying... 。

为了解决冲突,代码包含一个延迟为 1 秒(1000 毫秒)的 setTimeout 函数。延迟后,它尝试使用 server.close() 关闭先前的服务器实例,然后再次调用 server.listen() 在同一端口上重新启动服务器。

这种方法提供了重试机制,如果指定的端口已在使用中,则允许服务器在短暂延迟后自动重试。

请务必注意,此方法取决于 server 对象的可用性。如果无法访问,您可能需要调整代码或使用 net.createServer() 重新建立服务器以侦听同一端口。

通过妥善处理这些错误,您可以提高网络应用程序的稳健性并向用户提供有意义的反馈。请记住考虑应用程序的具体要求并相应地实施适当的错误处理策略。

Conclusion 结论

Node.js 中的 net 模块使您能够创建用于网络通信的 TCP 服务器和客户端。通过利用此模块,您可以建立连接、交换数据并构建强大的网络应用程序。通过有效的错误处理,您可以确保应用程序的可靠性和弹性。拥抱 Node.js 网络的可能性,并在构建创新解决方案时释放您的创造力。

原文链接:https://juejin.cn/post/7358270777984516134 作者:前端孺子牛

(0)
上一篇 2024年4月16日 下午4:11
下一篇 2024年4月16日 下午4:22

相关推荐

发表回复

登录后才能评论