如何在 NodeJS 中读取 TCP 端口/套接字?没有“阅读”方法

Cat*_*lin 5 sockets node.js

我应该与控制器通信,该控制器具有配置为发送状态数据的端口。我应该使用 NodeJS 读取特定 IP 的端口 2424。我已经尽我所能,但什么也没读到。这是我的困惑: * 我没有收到“连接”事件——这可能是因为在控制器级别实现的接口非常简单吗?或者没有建立连接 * 在 nodejs 的套接字中没有“读取”方法 - 只是一个从未收到任何东西的 on('data') 。

我提到我没有听,因为我的应用程序是一个客户端,不接受任何连接,只是连接到服务以接收数据

我的代码是这样的:

var host = 'xxx.yyy.zzz.ttt';
var port = 2424;
var client = net.connect({port:port, host:host}, function() {
    log.logOut(ModName, '[checkPortaRack] Client connected.');
});

client.setTimeout(SOCKET_TIMEOUT * 1000);

client
    .on('timeout', function() {
    client.destroy();
    callback(new Error("No data received. So device '"+dev.name+"' in error"));
})
.on('connect', function() {
    log.logOut(ModName, '[checkPortaRack] Connected...');
})
.on('data', function(chunk) {
    data += chunk;
    console.log(data.toString());
    log.logOut(ModName, 'Got data...');
    client.destroy();
})
.on('end', function() {
    data = data.toString().replace('\u0000',"");
    log.logOut(ModName, 'Data: '+JSON.stringify(data));
    console.log('client disconnected');
})
.on('error', function(e) {
    status.deviceDown = true;
    log.logOut(ModName, "[checkPortaRack][Device Error]["+dev.name+"] ERROR Getting data from device: " + e.message);
    callback(new Error("Error while receiving data. So device '"+dev.name+"' in error"));
});
Run Code Online (Sandbox Code Playgroud)

负责人发送了这个 C# 代码,他们说它很有魅力:

private void HandleClientComm(object client)
    {
        TcpClient tcpClient = (TcpClient)client;
        NetworkStream clientStream = tcpClient.GetStream();

        byte[] message = new byte[4096];
        int bytesRead;

        while (true)
        {
            bytesRead = 0;

            try
            {
                //blocks until a client sends a message
                bytesRead = clientStream.Read(message, 0, 4096);
            }
            catch
            {
                System.Diagnostics.Debug.WriteLine("catch");
                //a socket error has occured
                break;
            }

            if (bytesRead == 0)
            {
                //the client has disconnected from the server
                System.Diagnostics.Debug.WriteLine("Client Disconnected");
                break;
            }

            //message has successfully been received
            ASCIIEncoding encoder = new ASCIIEncoding();
            System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead));
        }

        tcpClient.Close();
    }
Run Code Online (Sandbox Code Playgroud)

所以,问题是:如何使用节点的套接字读取这个 ip/端口,没有“读取”方法并且没有发送“连接”事件?

非常感谢,卡特琳

msc*_*dex 0

您的节点代码通常看起来不错。

你可以尝试改变

var client = net.connect({port:port, host:host}, function() {
    log.logOut(ModName, '[checkPortaRack] Client connected.');
});
Run Code Online (Sandbox Code Playgroud)

var client = new net.Socket();
Run Code Online (Sandbox Code Playgroud)

然后将其添加到代码底部:

client.connect(port, host);
Run Code Online (Sandbox Code Playgroud)