通过套接字发送命令,但每次都等待响应(Node.js)

我需要通过telnet发送几个命令到服务器。 如果我尝试在每个命令之间没有时间延迟地发送它们,那么服务器就会吓坏了:

var net = require('net'); var conn = net.createConnection(8888, 'localhost'); conn.on('connect', function() { conn.write(command_1); conn.write(command_2); conn.write(command_3); //... conn.write(command_n); }) 

我猜服务器在发送命令n + 1之前需要一些时间来响应命令n 。 一种方法是写一些东西给日志,并假装“等待”:

 var net = require('net'); var conn = net.createConnection(8888, 'localhost'); conn.on('connect', function() { console.log('connected to server'); console.log('I'm about to send command #1'); conn.write(command_1); console.log('I'm about to send command #2'); conn.write(command_2); console.log('I'm about to send command #3'); conn.write(command_3); //... console.log('I'm about to send command #n'); conn.write(command_n); }) 

也许conn.write()是asynchronous的,而把一个接一个的命令不能保证正确的顺序呢?

无论如何,在两个连续的命令之间保证正确的顺序和足够的时间是正确的模式,以便服务器响应?

首先,如果这是一个真正的telnet服务器,那么你应该用telnet握手(terminal选项在对等体之间协商,这是打开套接字时可以看到的二进制数据)做一些事情。

如果您不想进入(取决于您的需求),您可以忽略谈判并直接进行业务,但是您必须阅读这些数据,并且自己忽略它。

现在,在您的代码中,只要服务器接受连接,就会发送数据。 这可能是你的烦恼的原因。 你不应该“等待”响应,由于nodejs的原因,响应将会asynchronous地向你发送:)所以你只需要从服务器得到“正确”的响应就发送这些命令(这​​实际上是有用的,因为你可以看到是否有任何错误等)。

我已经试过这个代码(基于你的)对我有一个远程login服务器的设备。 它会做一个login,然后注销。 看看事件是如何根据服务器的回应发出的:

 var net = require('net'); var conn = net.createConnection(23, '1.1.1.1'); var commands = [ "logout\n" ]; var i = 0; conn.setEncoding('ascii'); conn.on('connect', function() { conn.on('login', function () { conn.write('myUsername\n'); }); conn.on('password', function () { conn.write('myPassword\n'); }); conn.on('prompt', function () { conn.write(commands[i]); i++; }); conn.on('data', function(data) { console.log("got: " + data + "\n"); if (data.indexOf("login") != -1) { conn.emit('login'); } if (data.indexOf("password") != -1) { conn.emit('password'); } if (data.indexOf(">#") != -1) { conn.emit('prompt'); } }); }); 

看看这些命令是如何在一个数组中,在那里你可以迭代发送它们(提示事件将触发下一个命令)。 所以服务器的正确响应是下一个提示。 当服务器发送(在这种情况下)string>#时,发送另一个命令。

希望能帮助到你 :)

写入的顺序是有保证的。 然而:

  1. 您必须订阅数据事件。 conn.on('data',function(data){})会做。
  2. 您必须检查写入的返回值 – 如果写入失败,则必须等待“stream失”事件。 所以你应该检查是否有任何写入失败,如果它确实解决了这个问题。 如果没有 – 那么你可以留下当前的肮脏的解决scheme。
  3. 您必须检查您的服务器是否支持请求引导(发送多个请求而不等待响应)。 如果不是这样 – 在接收到前一个数据事件之前,不能发送下一个请求。
  4. 您必须确保您发送的命令是真正的telnet命令 – telnet需要在\ r \ n之后有一个\ 0字节(请参阅RFC),因此如果\ 0不存在,某些服务器可能会变得怪异。

所以:

 var net = require('net'); var conn = net.createConnection(8888, 'localhost'); conn.on('connect', function() { console.log(conn.write(command_1) && conn.write(command_2) && conn.write(command_3) && //... conn.write(command_n)) }) conn.on('data', function () {}) 

如果它写错了 – 那么你必须等待“stream失”。 如果它写的是真的 – 你必须实现等待。 我劝阻基于事件的解决scheme,并build议查看使用asynchronous或步骤NPM模块。