使用 ngrok 使用 tcp 隧道将数据发送到 tcp 端口时出错
Posted
技术标签:
【中文标题】使用 ngrok 使用 tcp 隧道将数据发送到 tcp 端口时出错【英文标题】:error while sending data to tcp port using tcp tunneling using ngrok 【发布时间】: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 端口的步骤。
-
启动 server.js
-
连接到 tcp 端口 8080
向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"
好的
通常发送的数据没有错误,但是在 tcp 端口上出现了一些未知的垃圾数据。并且有一些关闭的端口。我可以修复这个意外关闭和垃圾数据出现在 tcp 端口上吗?我的代码对吗?
通常的数据接收:
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 连接关闭或避免垃圾数据。
【问题讨论】:
【参考方案1】:-
我觉得你也应该听
error
事件
您假设on('data')
处理程序在给定事件上只处理一个命令/行?如果是这样,那么情况并非总是如此:您可能会获得部分数据,或者不止一个命令。如果换行符 (\n
) 是您的分隔符,那么您应该使用局部变量来缓冲输入,直到获得此分隔符,然后将缓冲的数据视为单行。
【讨论】:
对不起,我对 ngrok 和 node.js 这东西真的很陌生。是的,我假设一次(几秒钟后)有一条关于 on('data') 的短信。以上是关于使用 ngrok 使用 tcp 隧道将数据发送到 tcp 端口时出错的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# Socket 中使用 ngrok tcp 隧道
如何从 Google Colab Notebook 中杀死 Ngrok 隧道
使用 ngrok 将 SPFX WebPart 隧道传输到 BrowserStack