如何在 Node.js 中与 Net 建立持久连接?

Posted

技术标签:

【中文标题】如何在 Node.js 中与 Net 建立持久连接?【英文标题】:How to have a persistent connection with Net in Node.js? 【发布时间】:2019-03-04 21:33:54 【问题描述】:

我正在使用 Telnet - 客户端来验证电子邮件,我连接到服务器并以 250 响应,但是当我编写另一个命令并询问答案时,它根本不回答我。

这是我的代码:

 function ConnectTelnet()
  //var connection = new telnet();
  var response;
  var HOST = 'mail.dominio.com'; 
  var PORT = 25;

  var net = require('net');
  var client = net.connect(25,'mail.dominio.com',function()
    console.log('connected to server!');
    console.log('CONNECTED TO: ' + HOST + ':' + PORT);

    client.on('data', function(data) 
      console.log('Received: ' + data);
      response = data;
     if(response.indexOf("220") === -1)
    client.write('EHLO dominio.com')
    console.log(data)
  
    );
  )

有人知道我该如何继续吗?谢谢:)

【问题讨论】:

client.write 怎么样? 我已经修改了问题的代码,所以你可以看到我尝试使用 client.write () 但它只是不打印响应@Bergi 它不打印响应”是什么意思?您是否收到任何数据,是否包含"220" 【参考方案1】:

您无法在同一连接上发送数据、获得答案然后发送更多数据。 TCP 不会“单独”发送消息。 TCP是一种流协议,这意味着当你向套接字写入字节时,你会在接收端以相同的顺序得到相同的字节。没有任何“消息边界”或“数据包”的概念。

如果你想这样做,你需要每次都建立一个新的连接。

这就是我在同一连接上发送多个 EHLO 的方式:

const net = require('net');
const client = net.createConnection( host: '127.0.0.1', port: 1025 , () => 
  console.log('connected to server!');
  checkEHLO(client, [ 'xxx@xxx.xxx', 'xxx@xxx.xxx', 'xxx@xxx.xxx' ]);
);
client.on('data', (data) => 
  console.log(data.toString());
  client.end();
);
client.on('end', () => 
  console.log('disconnected from server');
);

function checkEHLO(client, emails)
    emails.forEach((email) => 
        client.write('EHLO ' + email + '\n');
    );

这是我得到的回应:

connected to server!
220 127.0.0.1 ESMTP Service Ready
250-Hello xxx@xxx.xxx
250-PIPELINING
250-8BITMIME
250-STARTTLS
250 AUTH PLAIN LOGIN
250-Hello xxx@xxx.xxx
250-PIPELINING
250-8BITMIME
250-STARTTLS
250 AUTH PLAIN LOGIN
250-Hello xxx@xxx.xxx
250-PIPELINING
250-8BITMIME
250-STARTTLS
250 AUTH LOGIN PLAIN

【讨论】:

解决此类问题的通常方法不是每次都创建新连接,而是发明或使用定义消息和消息之间分隔符的数据协议。最简单的方案是基于文本的方案,它以回车符结束每条消息。还有很多很多其他的设计在流协议中定义消息格式。

以上是关于如何在 Node.js 中与 Net 建立持久连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Node.js 建立与 MongoDB 数据库的 SSH 隧道连接

如何在 Socket.io 中与 Heroku 服务器建立 Socket 连接?

Node.js MySQL 需要持久连接

无法在 node.js 中建立对等 webrtc 连接

在 node.js 中与数据库通信

node.js中使用net模块创建服务器和客户端