You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Node.js TCP服务器的Socket连接注册技术咨询

Node.js TCP服务器与Bash客户端交互实现

我来帮你梳理这个技术场景下的代码细节和优化点,先看完整的可运行实现:

Node.js TCP服务器代码

原代码缺少net模块引入和JSON解析器的具体实现,这里给出带依赖和错误处理的完整版本(需要先执行npm install split2安装流式解析依赖):

const net = require('net');
const split2 = require('split2');

// 存储PID与对应客户端socket的映射,方便后续定向通信
const pidSocketMap = new Map(); 

const server = net.createServer((socket) => {
  // 把socket流按行分割,每行解析为JSON对象,同时处理解析错误
  socket.pipe(split2(line => {
    try {
      return JSON.parse(line);
    } catch (err) {
      console.error('Received invalid JSON:', line);
      return null;
    }
  })).on('data', (data) => {
    // 验证数据合法性后存入映射
    if (data && data.pid) {
      pidSocketMap.set(data.pid, socket);
      console.log(`Registered client with PID: ${data.pid}`);
    }
  });

  // 客户端断开时清理映射,避免内存泄漏
  socket.on('close', () => {
    for (const [pid, clientSocket] of pidSocketMap.entries()) {
      if (clientSocket === socket) {
        pidSocketMap.delete(pid);
        console.log(`Removed disconnected client PID: ${pid}`);
        break;
      }
    }
  });
});

// 启动服务器监听9091端口
server.listen(9091, 'localhost', () => {
  console.log('TCP server running on localhost:9091');
});

Bash客户端连接脚本

原脚本里的${ARGS}需要处理成合法的JSON数组格式,否则会导致JSON语法错误,这里给出优化后的版本:

#!/bin/bash

# 将脚本接收的参数转换为JSON数组格式(处理引号和逗号)
ARGS=$(printf '"%s",' "$@" | sed 's/,$//')

# 建立与TCP服务器的持久化双向连接,绑定到文件描述符3
exec 3<>/dev/tcp/localhost/9091
exit_code=$?

# 检查连接是否成功,错误信息输出到标准错误流
if [[ ${exit_code} -ne 0 ]]; then
  echo "Error: Failed to connect to daemon at localhost:9091" >&2
  exit 1
fi

# 发送包含PID、参数、当前工作目录的JSON数据
echo "{\"pid\":${BASH_PID},\"args\":[${ARGS}],\"cwd\":\"$(pwd)\"}" >&3

# 如果需要接收服务器响应,可添加以下代码
# read -r response <&3
# echo "Server response: ${response}"

# 可选:手动关闭文件描述符(脚本退出后会自动关闭)
# exec 3>&-

核心细节说明

  • Node.js端:

    • 用Map存储PID与socket的映射,方便后续通过PID向指定客户端推送消息
    • 流式解析JSON避免了大数据量下的内存溢出问题,同时增加错误处理防止非法JSON导致服务器崩溃
    • 监听客户端断开事件,及时清理无效映射,避免内存泄漏
  • Bash端:

    • exec 3<>/dev/tcp/...创建的是双向文件描述符,既可以发送数据(>&3)也可以接收数据(<&3)
    • 对${ARGS}做了JSON格式处理,确保发送的是合法的JSON字符串
    • 错误信息重定向到标准错误流,符合脚本开发的规范

内容的提问来源于stack exchange,提问作者Alexander Mills

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:32:30