Node.js替换C#连接非HTTP设备的Socket问题求助
问题描述
原系统使用C#通过原生Socket连接远程设备,基于IP+端口建立连接,收发短纯文本消息。现计划用Node.js重写客户端,环境为Node.js v21.7.1、Windows 10 Pro 10.0.19045,尝试两种方案后均出现问题:
方案1:socket.io-client
代码示例:
var socket = require("socket.io"); var socketcli = require("socket.io-client"); ... var strTestCli = "X.X.X.X:1024"; var sckTest = socketcli.connect(strTestCli); console.dir(sckTest); sckTest.on("connection", objConn => { console.log("Connected to " + strTestCli); objConn.on("disconnect", () => { console.log("Connected to " + strTestCli + " disconnected!"); }); });
输出显示sckTest的uri为undefined//X.X.X.X:1024,engine的hostname为undefined、port为80,连接异常。
方案2:websocket模块
代码示例:
var wsCli = require("websocket").client; ... var strTestCli = "ws://X.X.X.X:1024/"; var sckTest = new wsCli(strTestCli, 'echo-protocol'); console.dir(sckTest); sckTest.on("connectFailed", err => { console.log(err); }); sckTest.on("connect", objConn => { console.log("Connected to " + strTestCli); objConn.on("disconnect", () => { console.log("Connected to " + strTestCli + " disconnected!"); }); });
输出的uri信息正常,但仍无法建立有效连接。
解决方案
你确实走错了方向,核心问题是选了不匹配的库:
socket.io-client是Socket.IO协议的专用客户端,需要服务端也运行Socket.IO框架才能通信,而你的远程设备是原生TCP Socket服务,协议不兼容,所以无法正常连接。websocket模块是WebSocket协议客户端,WebSocket是基于HTTP的应用层协议,和原生TCP Socket不属于同一协议体系,设备未实现WebSocket协议的话自然连不上。
正确的做法是使用Node.js内置的net模块,它专门用于创建原生TCP Socket客户端,和你之前C#的Socket逻辑完全匹配。
示例代码
const net = require('net'); // 设备IP和端口 const deviceHost = 'X.X.X.X'; const devicePort = 1024; // 创建TCP客户端实例 const client = new net.Socket(); // 发起连接 client.connect(devicePort, deviceHost, () => { console.log(`已连接到 ${deviceHost}:${devicePort}`); // 发送纯文本消息 client.write('Hello from Node.js TCP Client!'); }); // 监听设备返回的消息 client.on('data', (data) => { console.log(`收到设备消息: ${data.toString()}`); // 按需处理消息,比如主动关闭连接 // client.destroy(); }); // 监听连接关闭事件 client.on('close', () => { console.log(`与 ${deviceHost}:${devicePort} 的连接已关闭`); }); // 监听连接错误 client.on('error', (err) => { console.error(`连接错误: ${err.message}`); });
代码说明
net.Socket对应C#中的Socket类,实现原生TCP通信逻辑connect方法传入端口和IP,建立与设备的TCP连接data事件接收设备发送的消息,通过toString()将Buffer转为纯文本close和error事件分别处理连接断开和异常情况
内容的提问来源于stack exchange,提问作者SPlatten
相关产品推荐
相关产品推荐

