当前位置: 首页 > 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://www.xdnf.cn/news/1110817.html

相关文章:

  • 【Flask】基础入门
  • 钉钉小程序开发环境配置与前端开发指南
  • 20250712-2-Kubernetes 应用程序生命周期管理-部署应用的流程_笔记
  • 009 ST表:静态区间最值的极致优化
  • OpenEuler操作系统测试USB摄像头
  • kettle从入门到精通 第101课 ETL之kettle DolphinScheduler调度kettle
  • 怎么在ComfyUI中查看别人训练的lora模型训练参数
  • 面试150 翻转二叉树
  • 26-计组-寻址方式
  • Git企业级开发(最终篇)
  • 手把手教你用YOLOv10打造智能垃圾检测系统
  • SpringBootloggers未授权访问漏洞处理
  • Java使用Langchai4j接入AI大模型的简单使用(四)--整合Springboot
  • 12.使用VGG网络进行Fashion-Mnist分类
  • 让 VSCode 调试器像 PyCharm 一样显示 Tensor Shape、变量形状、变量长度、维度信息
  • CSS flex
  • 安卓定制功能
  • 外设数据到昇腾310推理卡 之二dma_alloc_attrs
  • Linux系统编程——目录 IO
  • 理解小数的计算机表达
  • PyTorch神经网络实战:从零构建图像分类模型
  • 脉冲神经网络膜电位泄漏系数学习:开启时空动态特征提取的新篇章
  • 复现永恒之蓝
  • Linux - 安全排查 3
  • 飞算JavaAI:重新定义Java开发效率的智能引擎
  • python-for循环
  • 【TA/Unity】Shader基础结构
  • 强化学习、PPO和GRPO的通俗讲解
  • 创客匠人:解析创始人 IP 打造对知识变现的深层赋能
  • os.machine()详解