Node.js 中的 Net 模块提供了创建网络服务器和客户端的能力,促进计算机或设备之间通过互联网进行通信。无论您是要构建聊天应用程序、在系统之间传输数据还是创建网络游戏,Net 模块都是基本构建块。在本主题中,我们将探讨 Net 模块的基础知识并学习如何创建 TCP 服务器和客户端。
Working with the net module 使用网络模块
使用 Net 模块时,第一步是使用 require
语句将其包含在 Node.js 应用程序中:
ini
const net = require('node:net');
一旦包含在内, net
对象就变得可用,提供处理网络相关任务的函数和方法。使用 Net 模块,您可以创建一个侦听传入连接的 TCP 服务器。您还可以处理从客户端接收的数据,并管理客户端断开连接。同样,您可以创建一个 TCP 客户端,它与服务器建立连接、发送数据并处理从服务器接收的数据。
Creating a TCP server 创建 TCP 服务器
导入 net 模块后,您可以使用 net.createServer()
方法创建 TCP 服务器。该方法采用回调函数作为参数,每当建立新的客户端连接时就会调用该回调函数。在此回调函数内,您可以定义服务器应如何处理客户端请求。
下面是创建 TCP 服务器的基本示例,该服务器回显从客户端接收到的任何数据:
在 server.js
中设置 TCP 服务器:
javascript
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
中的连接:
javascript
// 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
函数的第一个参数指定服务器侦听传入连接的端口号。第二个参数是一个回调函数,一旦服务器开始监听,该函数就会被执行。
现在,如果您运行 Node.js 应用程序,您的 TCP 服务器将启动并侦听指定端口上的客户端连接。客户端可以使用服务器的 IP 地址和端口号与您的服务器建立连接。
Creating a TCP client 创建 TCP 客户端
.
在 Node.js 中,您可以使用 net
模块创建 TCP 客户端。该客户端通过传输控制协议(TCP)启用服务器通信。让我们探讨如何在 Node.js 中创建 TCP 客户端。
一旦网络模块可用,您就可以通过调用 net.createConnection()
方法创建 TCP 客户端。该方法将端口号和服务器地址作为参数,并返回代表连接客户端的套接字对象。
以下是创建 TCP 客户端并将其连接到服务器的示例:
javascript
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()
方法向服务器发送消息。
要从服务器接收数据,您可以侦听客户端套接字上的"data"事件:
javascript
client.on('data', (data) => {
console.log(`Received data from server: ${data}`);
// Close the connection after receiving data
client.end();
});
在上面的代码中,我们监听"data"事件并记录从服务器接收到的数据。我们在收到数据后还使用 client.end()
方法关闭连接。
处理错误并在必要时正常关闭连接非常重要。您可以侦听客户端套接字上的"错误"和"结束"事件,以分别处理错误和断开连接。
当客户端断开连接时,服务器会检测到此事件并记录一条消息,指示客户端已断开连接。
通过处理这些事件,您可以确保服务器在不同场景中的行为可预测,这是构建健壮的网络应用程序的一个关键方面。
Handling errors in net modules 处理网络模块中的错误
使用 Node.js 中的 net 模块创建 TCP 服务器和客户端时,处理网络通信过程中可能发生的错误非常重要。您可能遇到的两个常见错误是 ERR_SERVER_ALREADY_LISTEN
和 EADDRINUSE
。让我们了解如何有效地处理这些错误。
ERR_SERVER_ALREADY_LISTEN
:当您尝试在已被其他进程使用的端口上启动 TCP 服务器时,会发生此错误。要处理此错误,您可以使用 try...catch
块来捕获错误并提供适当的错误处理逻辑。这是一个例子:
vbnet
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'
。这是一个例子:
javascript
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 网络的可能性,并在构建创新解决方案时释放您的创造力。