nodejs监听tcp端口
在Node.js中,监听TCP端口可以通过内置的net
模块来实现。如何使用Node.js监听TCP端口,并提供详细的代码示例和多种解决方案。
解决方案
通过Node.js的net
模块,我们可以创建一个TCP服务器来监听指定的端口。基本步骤包括:引入net
模块、创建服务器实例、绑定端口并启动监听。我们还可以处理客户端连接、接收数据、发送数据以及关闭连接等操作。
方法一:使用net模块创建TCP服务器
这是最常见也是最直接的方法,以下是具体实现步骤:
- 引入
net
模块。 - 使用
net.createServer()
方法创建服务器。 - 绑定端口并开始监听。
- 处理客户端连接、数据接收和断开连接事件。
示例代码
javascript
const net = require('net');</p>
<p>// 创建TCP服务器
const server = net.createServer((socket) => {
console.log('客户端已连接');</p>
<pre><code>// 监听数据接收事件
socket.on('data', (data) => {
console.log(`收到数据: ${data}`);
socket.write('服务器已收到你的消息!');
});
// 监听客户端断开事件
socket.on('end', () => {
console.log('客户端已断开');
});
// 捕获错误
socket.on('error', (err) => {
console.error('发生错误:', err);
});
});
// 监听端口
server.listen(8080, () => {
console.log('TCP服务器正在监听端口 8080...');
});
说明
net.createServer()
:创建一个TCP服务器。socket.on('data')
:当接收到数据时触发。socket.write()
:向客户端发送数据。socket.on('end')
:当客户端断开连接时触发。
方法二:使用async/await简化异步逻辑
如果需要更优雅地处理异步逻辑,可以结合util.promisify
和async/await
来实现。
示例代码
javascript
const net = require('net');
const util = require('util');</p>
<p>// 创建TCP服务器
const server = net.createServer();</p>
<p>// 将listen方法转换为Promise形式
server.listenAsync = util.promisify(server.listen);</p>
<p>(async function startServer() {
try {
await server.listenAsync(8080);
console.log('TCP服务器正在监听端口 8080...');
} catch (err) {
console.error('服务器启动失败:', err);
}
})();</p>
<p>// 处理客户端连接
server.on('connection', (socket) => {
console.log('客户端已连接');</p>
<pre><code>socket.on('data', (data) => {
console.log(`收到数据: ${data}`);
socket.write('服务器已收到你的消息!');
});
socket.on('end', () => {
console.log('客户端已断开');
});
socket.on('error', (err) => {
console.error('发生错误:', err);
});
});
说明
- 使用
util.promisify
将server.listen
方法转换为Promise形式,从而可以用async/await
语法简化异步逻辑。 - 这种方式使代码更加清晰,尤其适合复杂的异步场景。
方法三:支持多个客户端并发连接
在实际应用中,服务器可能需要同时处理多个客户端连接。Node.js的事件驱动模型天然支持高并发,因此无需额外修改即可支持多客户端连接。
示例代码
javascript
const net = require('net');</p>
<p>// 创建TCP服务器
const server = net.createServer();</p>
<p>// 存储所有客户端的socket对象
const clients = [];</p>
<p>server.on('connection', (socket) => {
console.log('新客户端已连接');</p>
<pre><code>// 将当前socket加入客户端列表
clients.push(socket);
// 发送欢迎消息
socket.write('欢迎连接到服务器!n');
// 接收数据
socket.on('data', (data) => {
console.log(`收到数据: ${data}`);
socket.write('服务器已收到你的消息!');
});
// 客户端断开时移除socket
socket.on('end', () => {
console.log('客户端已断开');
clients.splice(clients.indexOf(socket), 1);
});
// 捕获错误
socket.on('error', (err) => {
console.error('发生错误:', err);
clients.splice(clients.indexOf(socket), 1);
});
});
// 广播消息给所有客户端
function broadcastMessage(message) {
clients.forEach((client) => {
if (client.writable) {
client.write(message);
}
});
}
// 启动服务器
server.listen(8080, () => {
console.log('TCP服务器正在监听端口 8080...');
});
说明
- 使用
clients
数组存储所有连接的客户端socket对象。 - 提供
broadcastMessage
函数,用于向所有客户端广播消息。 - 在客户端断开或发生错误时,从
clients
数组中移除对应的socket对象。
三种使用Node.js监听TCP端口的方法:
1. 基于net
模块的基本实现。
2. 结合async/await
简化异步逻辑。
3. 支持多客户端并发连接的实现。
根据实际需求选择合适的方案。对于简单的应用场景,种方法已经足够;而对于需要处理复杂业务逻辑或高并发的情况,则可以选择后两种方法。