基于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
相关产品推荐
相关产品推荐

