当前位置: 首页 > news >正文

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);
});

关键特性

  1. 连接对象 (socket)

    • 继承自 stream.Duplex,可读写数据流
    • 常用事件:dataenderrorclose
  2. 配置选项

    const server = net.createServer({allowHalfOpen: false, // 是否允许半开连接(默认 false)pauseOnConnect: false // 是否暂停连接数据流(默认 false)
    }, (socket) => { /* ... */ });
    
  3. 服务器事件

    • 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();});
});

常见问题

  1. 端口占用错误
    确保端口未被占用,或使用 server.on('error', (e) => { if (e.code === 'EADDRINUSE') { /* 处理逻辑 */ } })

  2. 数据边界问题
    TCP 是流式协议,需自行处理消息边界(可用 \n 分隔符或固定长度前缀)

  3. 性能优化

    • 使用 socket.setNoDelay(true) 禁用 Nagle 算法
    • 避免在回调中执行阻塞操作

与 HTTP 服务器的区别

特性TCP 服务器 (net)HTTP 服务器 (http)
协议层传输层 (TCP)应用层 (HTTP)
数据格式原始字节流结构化 HTTP 报文
内置解析自动解析请求头/方法/URL
适用场景自定义协议、实时通信Web 服务、API 接口

通过 net.createServer 可以实现:

  • 自定义协议通信(如游戏服务器、即时通讯)
  • 代理服务器
  • 原始 TCP 数据处理
  • 与 C/C++ 等其他语言编写的服务交互

建议结合 stream 模块和 Buffer 类处理复杂数据流场景。


文章转载自:
http://amygdalae.aaladrg.cn
http://chloridize.aaladrg.cn
http://cannibalistic.aaladrg.cn
http://capricornus.aaladrg.cn
http://cairn.aaladrg.cn
http://aftergrowth.aaladrg.cn
http://aloud.aaladrg.cn
http://bruise.aaladrg.cn
http://calchas.aaladrg.cn
http://blunderhead.aaladrg.cn
http://chicalote.aaladrg.cn
http://blazing.aaladrg.cn
http://chiffonade.aaladrg.cn
http://assertative.aaladrg.cn
http://caenogenesis.aaladrg.cn
http://abjection.aaladrg.cn
http://cauterize.aaladrg.cn
http://cablevision.aaladrg.cn
http://actinomorphic.aaladrg.cn
http://calcedony.aaladrg.cn
http://autolysis.aaladrg.cn
http://adjudicative.aaladrg.cn
http://barleycorn.aaladrg.cn
http://archonship.aaladrg.cn
http://assistor.aaladrg.cn
http://caressant.aaladrg.cn
http://ced.aaladrg.cn
http://cashmerette.aaladrg.cn
http://belowdecks.aaladrg.cn
http://cheshvan.aaladrg.cn
http://www.dtcms.com/a/276251.html

相关文章:

  • Python后端项目之:我为什么使用pdm+uv
  • 模拟注意力:少量参数放大 Attention 表征能力
  • hiredis: 一个轻量级、高性能的 C 语言 Redis 客户端库
  • 深入解析C#接口实现的两种核心技术:派生继承 vs 显式实现
  • Java 21 虚拟线程
  • 浏览器宏任务的最小延时:揭开setTimeout 4ms的神话
  • java中的main方法
  • window7,windows10,windows11种系统之间实现打印机共享
  • 创客匠人:从定位逻辑看创始人 IP 如何驱动 IP 变现
  • CompareFace使用
  • Kimi K2万亿参数开源模型原理介绍
  • 【读书笔记】《C++ Software Design》第二章:The Art of Building Abstractions
  • Ruby如何采集直播数据源地址
  • OpenEuler操作系统中检测插入的USB设备并自动挂载
  • 【数据结构】反射、枚举 和 lambda表达式
  • Golang 面向对象(封装、继承、多态)
  • 【C语言】指针进阶:指针和数组
  • 手把手教你用YOLOv10打造智能垃圾检测系统
  • 第七章应用题
  • Geant4 安装---Ubuntu
  • 一篇博客学习Lua_安装使用+语法详解
  • Lua ADB 接口文档
  • RMSNorm实现
  • 2.单例模式
  • Vim的magic模式
  • blender uv小技巧
  • Python 包管理新时代:深入了解 `uv` 的使用与实践
  • OpenVela之模拟器调试
  • 【kubernetes】--Controller(StatefulSet)
  • 【PTA数据结构 | C语言版】链式队列的3个操作