net.createServer详解
基础用法
const net = require('net');// 创建 TCP 服务器
const server = net.createServer((socket) => {// 当客户端连接时触发console.log('客户端已连接');// 接收客户端数据socket.on('data', (data) => {console.log('收到数据:', data.toString());socket.write('服务器已收到: ' + data); // 回复客户端});// 连接关闭事件socket.on('end', () => {console.log('客户端已断开');});// 错误处理socket.on('error', (err) => {console.error('连接错误:', err);});
});// 监听端口
server.listen(3000, () => {console.log('服务器已启动,监听端口 3000');
});// 服务器错误处理
server.on('error', (err) => {console.error('服务器错误:', err);
});
关键特性
-
连接对象 (
socket
)- 继承自
stream.Duplex
,可读写数据流 - 常用事件:
data
、end
、error
、close
- 继承自
-
配置选项
const server = net.createServer({allowHalfOpen: false, // 是否允许半开连接(默认 false)pauseOnConnect: false // 是否暂停连接数据流(默认 false) }, (socket) => { /* ... */ });
-
服务器事件
listening
:服务器开始监听时触发connection
:新连接建立时触发(等同于回调函数)close
:服务器关闭时触发error
:服务器错误时触发
高级用法
1. 限制最大连接数
server.maxConnections = 10; // 最大允许 10 个并发连接
server.getConnections((err, count) => {console.log(`当前连接数: ${count}`);
});
2. 保持连接活跃
socket.setKeepAlive(true, 60000); // 启用 TCP Keep-Alive,60秒检测一次
3. 超时控制
socket.setTimeout(30000); // 30 秒无活动后超时
socket.on('timeout', () => {console.log('连接超时');socket.end();
});
4. 获取客户端信息
socket.on('data', (data) => {console.log(`客户端地址: ${socket.remoteAddress}:${socket.remotePort}`);console.log(`本地地址: ${socket.localAddress}:${socket.localPort}`);
});
完整生命周期示例
const server = net.createServer();server.on('listening', () => {console.log('服务器正在监听...');
});server.on('connection', (socket) => {console.log(`新连接来自 ${socket.remoteAddress}`);socket.on('data', (data) => {console.log(`收到 ${data.length} 字节数据`);});socket.on('close', () => {console.log('连接已关闭');});
});server.on('close', () => {console.log('服务器已关闭');
});server.listen(3000);// 关闭服务器(通常在需要优雅退出时调用)
process.on('SIGINT', () => {server.close(() => {console.log('服务器已终止');process.exit();});
});
常见问题
-
端口占用错误
确保端口未被占用,或使用server.on('error', (e) => { if (e.code === 'EADDRINUSE') { /* 处理逻辑 */ } })
-
数据边界问题
TCP 是流式协议,需自行处理消息边界(可用\n
分隔符或固定长度前缀) -
性能优化
- 使用
socket.setNoDelay(true)
禁用 Nagle 算法 - 避免在回调中执行阻塞操作
- 使用
与 HTTP 服务器的区别
特性 | TCP 服务器 (net ) | HTTP 服务器 (http ) |
---|---|---|
协议层 | 传输层 (TCP) | 应用层 (HTTP) |
数据格式 | 原始字节流 | 结构化 HTTP 报文 |
内置解析 | 无 | 自动解析请求头/方法/URL |
适用场景 | 自定义协议、实时通信 | Web 服务、API 接口 |
通过 net.createServer
可以实现:
- 自定义协议通信(如游戏服务器、即时通讯)
- 代理服务器
- 原始 TCP 数据处理
- 与 C/C++ 等其他语言编写的服务交互
建议结合 stream
模块和 Buffer
类处理复杂数据流场景。