【问题标题】:error while sending data to tcp port using tcp tunneling using ngrok使用 ngrok 使用 tcp 隧道将数据发送到 tcp 端口时出错
【发布时间】:2022-01-21 04:22:10
【问题描述】:

我想将 TCP 数据发送到全局公开的端口。我写了一个服务器代码:

server.js

const net = require('net');
const port = 8080;
const host = '127.0.0.1';
var fs = require("fs");

const server = net.createServer();
server.listen(port, host, () => {
    console.log('TCP Server is running on port ' + port + '.');
});

let sockets = [];

fs.writeFile('tcpdata.log', 'id,pm25,pm10,temp,hum,atm,loc,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10.m11,m12,m13,m14,m15,m16\n', function (err) {
  if (err) throw err;
  console.log('Created successfully.');
});

server.on('connection', function(sock) {
    console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);

    sockets.push(sock);

    sock.on('data', function(data) {
        console.log('DATA ' + sock.remoteAddress + ': ' + data);
        fs.appendFile('tcpdata.log', data, function(error){console.log('data written');});
        // Write the data back to all the connected, the client will receive it as data from the server
        sockets.forEach(function(sock, index, array) {
            sock.write(sock.remoteAddress + ':' + sock.remotePort + " said " + data + '\n');
        });
    });

    // Add a 'close' event handler to this instance of socket
    sock.on('close', function(data) {
        let index = sockets.findIndex(function(o) {
            return o.remoteAddress === sock.remoteAddress && o.remotePort === sock.remotePort;
        })
        if (index !== -1) sockets.splice(index, 1);
        console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort);
    });
});

将数据发送到 TCP 端口的步骤。

  1. 启动 server.js

  1. 连接到 tcp 端口 8080

  1. 向tcp端口“2.tcp.ngrok.io:16185”发送数据的AT命令

    AT+CREG=1

    好的

    AT+CREG?

    +CREG: 1

    AT+GPS=1

    好的

    AT+CGATT=1

    +CGATT:1

    好的

    AT+CGDCONT=1,"IP","pinternet.interkom.de"

    好的

    AT+CGACT=1,1

    好的

    AT+CIPSTART="TCP","2.tcp.ngrok.io",16185

    连接正常

    好的

    AT+CIPSEND=101,"'A1',22.00,31.00,7.00,15.00,0.00,$GNGGA,170219.094,4900.5489,N,00825.5612,E,0,3,,311.5,M,47.9,M, ,*51"

    好的

    AT+CIPSTART="TCP","2.tcp.ngrok.io",16185

    已经连接

    好的

    AT+CIPSEND=101,"'A1',23.00,33.00,6.00,14.00,1.00,$GNGGA,170230.000,4900.5372,N,00825.4908,E,0,4,,227.4,M,47.9,M, ,*53"

    好的

  2. 通常发送的数据没有错误,但是在 tcp 端口上出现了一些未知的垃圾数据。并且有一些关闭的端口。我可以修复这个意外关闭和垃圾数据出现在 tcp 端口上吗?我的代码对吗?

  3. 通常的数据接收:

  4. TCP 端口上的意外错误和关闭

events.js:353
      throw er; // Unhandled 'error' event

data written
CONNECTED: 127.0.0.1:58072
DATA 127.0.0.1: SSH-2.0-Renci.SshNet.SshClient.0.0.1

请您帮忙解决这个问题。如何避免意外的 tcp 连接关闭或避免垃圾数据。

【问题讨论】:

    标签: node.js tcp at-command ngrok


    【解决方案1】:
    1. 我觉得你也应该听error事件
    2. 您假设on('data') 处理程序在给定事件上只处理一个命令/行?如果是这样,那么情况并非总是如此:您可能会获得部分数据,或者不止一个命令。如果换行符 (\n) 是您的分隔符,那么您应该使用局部变量来缓冲输入,直到获得此分隔符,然后将缓冲的数据视为单行。

    【讨论】:

    • 对不起,我对 ngrok 和 node.js 这东西真的很陌生。是的,我假设一次(几秒钟后)有一条关于 on('data') 的短信。
    猜你喜欢
    • 2021-03-27
    • 2011-05-19
    • 2012-12-20
    • 2013-03-23
    • 1970-01-01
    • 2012-05-21
    • 2017-09-14
    • 2016-04-27
    • 2012-03-14
    相关资源
    最近更新 更多