TCP-клиент Node.js ведет себя иначе, чем Netcat/Telnet

Я отправляю текстовые команды, разделенные новой строкой, на TCP-сервер пользовательского протокола. В приведенном ниже примере я выдаю 2 команды и получаю письменный ответ. Он работает, как и ожидалось, в telnet и netcat:

$ nc localhost 1234
command1
command2
theresponse

Тот же рабочий процесс не работает при подключении к Node.js:

var net = require('net');
var client = net.connect(1234, 'localhost');

client.on('data', function(data) {
    console.log('data:', data.toString());
});

client.on('error', function(err) {
    console.log('error:', err.message);
});

client.write('command1\n');
client.write('command2\n');

Я ожидаю, что после запуска этой программы я увижу «данные: ответ», написанный на консоли, однако ничего не печатается. Я также пытался выполнить запись внутри обратного вызова «connect», но у меня те же результаты. Любопытно то, что когда я пробую это в Node REPL... это работает:

$ node
> var net = require('net')
undefined
> var client = net.connect(1234, 'localhost')
undefined
> client.on('data', function(data) { console.log('data:', data.toString()); })
{ ... }
> client.write('command1\n')
true
> client.write('command2\n')
true
> data: theresponse

У кого-нибудь есть идеи по поводу этого странного поведения?

Спасибо.

-Скотт


person scttnlsn    schedule 23.05.2012    source источник
comment
Из того, что вы описываете, похоже, что у вашего TCP-сервера возникают проблемы, если две или более команд поступают в одном пакете. Не могли бы вы показать код сервера?   -  person stewe    schedule 24.05.2012
comment
У меня нет доступа к коду сервера, но я считаю, что вы правы. Сервер, вероятно, предполагает, что каждый поступающий буфер данных представляет собой одну команду. Спасибо.   -  person scttnlsn    schedule 24.05.2012
comment
Я должен что-то упустить, но если это ошибка сервера, почему он работает в Node.js REPL?   -  person JP Richardson    schedule 24.05.2012
comment
По той же причине, по которой это работало в Netcat — ввод следующей строки занимает немного времени. За это время первая команда предположительно была сброшена на сервер.   -  person scttnlsn    schedule 24.05.2012


Ответы (1)


Не тестируя код, я предполагаю, что вас кусает асинхронная природа Node.js. В REPL соединение происходит до того, как вы сможете ввести другую команду. В приведенном выше коде вы пишете перед подключением.

Измените приведенный выше код на этот:

var net = require('net');
var client = net.connect(1234, function(){
   client.on('data', function(data) {
     console.log('data:', data.toString());
   });

   client.on('error', function(err) {
     console.log('error:', err.message);
   });

   client.write('command1\n');
   client.write('command2\n');
});
person JP Richardson    schedule 23.05.2012
comment
Я попытался выполнить запись в обратном вызове подключения, но получил те же результаты. - person scttnlsn; 24.05.2012