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

1.4 Node.js 的 TCP 和 UDP

TCP

Node.js 的 net 模块是其内置模块之一,主要用于创建基于 TCP(Transmission Control Protocol)的网络应用,包括服务器和客户端。

核心功能与 API

1. 创建 TCP 服务器

使用 net.createServer() 方法创建服务器,通过回调函数处理连接事件:

const net = require('net');const server = net.createServer((socket) => {// 处理客户端连接console.log('客户端已连接');// 监听数据事件(客户端发送数据时触发)socket.on('data', (data) => {console.log(`收到数据:${data.toString()}`);socket.write('服务器已收到消息'); // 向客户端发送响应});// 监听连接关闭事件socket.on('end', () => {console.log('客户端已断开连接');});
});// 启动服务器,监听指定端口
server.listen(3000, () => {console.log('服务器已启动,监听端口 3000');
});
2. 创建 TCP 客户端

使用 net.createConnection() 方法创建客户端,连接到服务器:

const net = require('net');const client = net.createConnection({ port: 3000 }, () => {// 连接成功后发送数据console.log('已连接到服务器');client.write('你好,这是客户端发送的消息');
});// 监听服务器响应
client.on('data', (data) => {console.log(`收到服务器响应:${data.toString()}`);client.end(); // 关闭连接
});// 监听连接关闭事件
client.on('end', () => {console.log('已断开与服务器的连接');
});
3. 核心对象与事件
  • net.Server:服务器对象,常用方法:

    • server.listen(port, callback):启动服务器监听。
    • server.close():关闭服务器。
    • server.maxConnections:设置最大连接数。
  • net.Socket:表示单个客户端连接,常用事件和方法:

    • 事件
      • 'data':收到数据时触发。
      • 'end':连接关闭时触发。
      • 'error':发生错误时触发。
      • 'connect':客户端连接成功时触发。
    • 方法
      • socket.write(data):向对方发送数据。
      • socket.end():关闭连接(允许发送缓冲区数据)。
      • socket.destroy():立即关闭连接。
      • socket.pipe(destination):数据管道传输。

完整案例:简单的 TCP 聊天应用

服务器端代码
const net = require('net');// 存储所有连接的客户端
const clients = new Set();const server = net.createServer((socket) => {// 为每个客户端分配唯一标识符const clientId = `客户端${Date.now().toString().slice(-4)}`;clients.add(socket);console.log(`${clientId} 已连接`);socket.write(`欢迎,你是 ${clientId}`);// 广播消息给其他客户端socket.on('data', (data) => {const message = `${clientId}: ${data.toString()}`;clients.forEach((client) => {if (client !== socket) {client.write(message);}});});// 客户端断开连接socket.on('end', () => {clients.delete(socket);console.log(`${clientId} 已断开连接`);});// 错误处理socket.on('error', (err) => {console.error(`客户端 ${clientId} 发生错误:`, err.message);clients.delete(socket);socket.destroy();});
});server.listen(3000, () => {console.log('聊天服务器已启动,监听端口 3000');
});
客户端代码
const net = require('net');
const readline = require('readline');// 创建标准输入输出接口
const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});// 连接到服务器
const client = net.createConnection({ port: 3000 }, () => {console.log('已连接到聊天服务器');console.log('输入消息并按 Enter 发送,输入 "exit" 退出');// 从标准输入读取用户消息并发送给服务器rl.on('line', (input) => {if (input.trim().toLowerCase() === 'exit') {client.end();rl.close();} else {client.write(input);}});
});// 接收服务器消息并打印
client.on('data', (data) => {console.log(data.toString());
});// 处理连接关闭
client.on('end', () => {console.log('已断开与服务器的连接');rl.close();
});// 错误处理
client.on('error', (err) => {console.error('连接错误:', err.message);rl.close();
});

使用步骤

  1. 启动服务器

    node server.js
    
  2. 启动多个客户端(在不同终端窗口):

    node client.js
    
  3. 测试

    • 在客户端输入消息,按 Enter 发送。
    • 所有客户端(包括发送者)都会收到消息。
    • 输入 exit 退出客户端。

注意事项

  1. 数据编码:默认情况下,net 模块以二进制形式传输数据,需通过 toString() 转换为字符串。
  2. 错误处理:务必监听 'error' 事件,避免未捕获的异常导致程序崩溃。
  3. 连接管理:生产环境中需限制最大连接数(server.maxConnections),并实现心跳机制检测死连接。
  4. 数据完整性:TCP 是流协议,需自行处理消息边界(如通过分隔符或长度前缀)。

UDP

Node.js 的 dgram 模块提供了创建 UDP(User Datagram Protocol)服务器和客户端的功能。UDP 是一种无连接的传输协议,与 TCP 相比,它更轻量、传输速度更快,但不保证数据的可靠传输和顺序。下面详细介绍其核心功能、API 及使用案例。

核心功能与 API

1. 创建 UDP 服务器

使用 dgram.createSocket() 方法创建 UDP 套接字,监听消息:

const dgram = require('dgram');// 创建 UDP 服务器(UDP4 表示 IPv4,UDP6 表示 IPv6)
const server = dgram.createSocket('udp4');// 监听消息事件
server.on('message', (msg, rinfo) => {console.log(`收到来自 ${rinfo.address}:${rinfo.port} 的消息: ${msg.toString()}`);// 向客户端发送响应const response = Buffer.from('服务器已收到消息');server.send(response, rinfo.port, rinfo.address, (err) => {if (err) console.error('发送响应失败:', err);});
});// 监听错误事件
server.on('error', (err) => {console.error('服务器错误:', err);server.close();
});// 监听启动成功事件
server.on('listening', () => {const address = server.address();console.log(`服务器监听在 ${address.address}:${address.port}`);
});// 绑定端口启动服务器
server.bind(3000);
2. 创建 UDP 客户端

同样使用 dgram.createSocket() 创建套接字,向服务器发送消息并接收响应:

const dgram = require('dgram');// 创建 UDP 客户端
const client = dgram.createSocket('udp4');// 准备要发送的消息
const message = Buffer.from('你好,这是客户端发送的消息');// 向服务器发送消息
client.send(message, 3000, 'localhost', (err) => {if (err) {console.error('发送消息失败:', err);client.close();return;}console.log('消息已发送到服务器');
});// 监听服务器响应
client.on('message', (msg, rinfo) => {console.log(`收到来自 ${rinfo.address}:${rinfo.port} 的响应: ${msg.toString()}`);client.close();
});// 监听错误事件
client.on('error', (err) => {console.error('客户端错误:', err);client.close();
});
3. 核心对象与事件
  • dgram.Socket:UDP 套接字对象,常用方法:

    • socket.send(msg, port, address, callback):向指定地址和端口发送消息。
    • socket.bind(port, [address], [callback]):绑定端口启动监听(服务器端使用)。
    • socket.close():关闭套接字。
    • socket.setBroadcast(flag):设置是否允许广播。
  • 常用事件

    • 'message':收到消息时触发,回调参数为 (msg, rinfo),其中 rinfo 包含发送方的地址和端口信息。
    • 'listening':套接字开始监听时触发。
    • 'error':发生错误时触发。
    • 'close':套接字关闭时触发。

完整案例:简单的 UDP 消息应用

服务器端代码
const dgram = require('dgram');// 创建 UDP 服务器
const server = dgram.createSocket('udp4');// 存储所有客户端信息(实际应用中可能需要更复杂的管理)
const clients = new Set();// 监听消息事件
server.on('message', (msg, rinfo) => {const clientKey = `${rinfo.address}:${rinfo.port}`;// 首次收到消息时记录客户端信息if (!clients.has(clientKey)) {clients.add(clientKey);console.log(`新客户端 ${clientKey} 已连接`);}console.log(`收到 ${clientKey} 的消息: ${msg.toString()}`);// 广播消息给所有客户端(除发送者外)clients.forEach((client) => {if (client !== clientKey) {const [address, port] = client.split(':');server.send(`${clientKey}: ${msg.toString()}`, parseInt(port), address);}});
});// 监听错误事件
server.on('error', (err) => {console.error('服务器错误:', err);server.close();
});// 监听启动成功事件
server.on('listening', () => {const address = server.address();console.log(`服务器监听在 ${address.address}:${address.port}`);
});// 绑定端口启动服务器
server.bind(3000);
客户端代码
const dgram = require('dgram');
const readline = require('readline');// 创建标准输入输出接口
const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});// 创建 UDP 客户端
const client = dgram.createSocket('udp4');// 服务器地址和端口
const serverAddress = 'localhost';
const serverPort = 3000;// 提示用户输入消息
console.log('输入消息并按 Enter 发送,输入 "exit" 退出');// 从标准输入读取用户消息并发送给服务器
rl.on('line', (input) => {if (input.trim().toLowerCase() === 'exit') {client.close();rl.close();return;}const message = Buffer.from(input);client.send(message, serverPort, serverAddress, (err) => {if (err) console.error('发送消息失败:', err);});
});// 监听服务器或其他客户端的消息
client.on('message', (msg, rinfo) => {console.log(`收到 ${rinfo.address}:${rinfo.port} 的消息: ${msg.toString()}`);
});// 监听错误事件
client.on('error', (err) => {console.error('客户端错误:', err);client.close();rl.close();
});// 绑定客户端端口(可选,不指定时系统会分配随机端口)
client.bind(() => {const address = client.address();console.log(`客户端已启动,使用端口 ${address.port}`);
});

使用步骤

  1. 启动服务器

    node udp_server.js
    
  2. 启动多个客户端(在不同终端窗口):

    node udp_client.js
    
  3. 测试

    • 在任一客户端输入消息,按 Enter 发送。
    • 所有客户端(包括发送者)都会收到消息。
    • 输入 exit 退出客户端。

注意事项

  1. 消息大小限制:UDP 数据包有最大大小限制(通常为 65,507 字节),超过限制的消息会被丢弃。
  2. 不可靠传输:UDP 不保证消息的可靠到达和顺序,适合对实时性要求高但对数据完整性要求较低的场景(如视频流、游戏)。
  3. 广播和组播:UDP 支持广播(255.255.255.255)和组播(如 224.0.0.1),可通过 socket.setBroadcast(true) 启用。
  4. 错误处理:尽管 UDP 不可靠,但仍需监听 'error' 事件处理网络错误。
http://www.xdnf.cn/news/12513.html

相关文章:

  • 基于 STM32 的四路 PWM 控制智能小车运动的模块化控制程序
  • PDF图片和表格等信息提取开源项目
  • FastAPI安全机制:从OAuth2到JWT的魔法通关秘籍
  • Web前端基础:JavaScript
  • C++字符串解析2
  • yolov11与双目测距结合,实现目标的识别和定位测距(onnx版本)
  • Docker、Wsl 打包迁移环境
  • |从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面
  • pycharm 中文字体报错
  • 从零开始搭建 Pytest 测试框架(Python 3.8 + PyCharm 版)
  • Android Studio 解决首次安装时下载 Gradle 慢问题
  • spring中的@RabbitListener注解详解
  • C++设计模式 - 单例模式
  • Python Copilot【代码辅助工具】 简介
  • AI数据分析在体育中的应用:技术与实践
  • 初识结构体,整型提升及操作符的属性
  • 12.6Swing控件4 JSplitPane JTabbedPane
  • 第六章 进阶18 小杨的困惑
  • 博弈论概述
  • 网络库libhv介绍
  • Selenium自动化测试之弹窗处理
  • [Python学习日记-91] 并发编程之多线程 —— threading 模块、开启线程的方式、线程相关的其他方法
  • 腾讯加持,销售易 CRM 优势几何?
  • 本机无法远程别的计算机的方法
  • 自制喜悦字贴
  • QILSTE 精巧电子元件H4-108FO/5M解析
  • 观测云OaC能力升级,通过Terraform实现配置闭环
  • MySQL基础(一)介绍、下载及安装
  • w384药品管理系统的设计与实现
  • MySQL基础(三)DQL(Data Query Language,数据查询语言)