node.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > node.js > Node.js TCP 和 UDP

Node.js 的 TCP 和 UDP使用示例代码详解

作者:chxii

Node.js的net模块是其内置模块之一,主要用于创建基于 TCP(Transmission Control Protocol)的网络应用,包括服务器和客户端,本文给大家介绍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:服务器对象,常用方法:

net.Socket:表示单个客户端连接,常用事件和方法:

事件

方法

完整案例:简单的 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();
});

使用步骤

启动服务器

node server.js

启动多个客户端(在不同终端窗口):

node client.js

测试

注意事项

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. 核心对象与事件

常用事件

完整案例:简单的 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}`);
});

使用步骤

启动服务器

node udp_server.js

启动多个客户端(在不同终端窗口):

node udp_client.js

测试

注意事项

到此这篇关于Node.js 的 TCP 和 UDP的文章就介绍到这了,更多相关Node.js TCP 和 UDP内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文