Пинг и сообщения сетевого модуля node.js не происходят

У меня есть два приложения node.js, работающие рядом на моем сервере, и я не хочу отправлять сообщения на стороне сервера между ними легким способом, используя собственный модуль node.js (v0.10.33) net.

Я намереваюсь, чтобы первое приложение отправляло сообщения второму. Я вижу журнал консоли listening...,

В первом приложении:

var push='';
var net=require('net');
var server=net.createServer(function(p){
    p.on('error',function(err){console.log(err);});
    push=p;
    setInterval(function(){push.write(JSON.stringify({'f':'ping','data':'stay alive'}));},1000);
    });
server.listen(8008,function(){console.log('listening...')});

//a real message might be sent later in the application (this example would need a setTimeout)
push.write(JSON.stringify({'f':'msg','data':'Hello World'}));

Во втором приложении вижу лог консоли open

var net=require('net');
var pull=new net.Socket();
pull.connect(8008,'127.0.0.1',function(){console.log('open');
pull.on('data',function(_){
    _=JSON.parse(_);
    if(_.f==='ping'){console.log('!!!ping!!!');}
    else{console.log(_.data);}
    });
pull.on('error',function(err){console.log('pull: '+err);});
});

Однако я не вижу никакой другой активности (нет пингов, а позже после открытия события, нет приветствия мира) и никаких ошибок.

Если я проверяю с помощью console.dir(pull), я не вижу событий для приема данных, например: ondata или onmessage

Что случилось?


person 8DK    schedule 04.11.2014    source источник


Ответы (1)


К сожалению, я должен отметить, что эта схема обмена сообщениями в корне нарушена. Вы используете TCP, который обеспечивает поток байтов, а не сообщений.

Несмотря на то, что TCP отправляет данные через IP-пакеты, TCP не является пакетным протоколом. Сокет TCP — это просто поток данных. Таким образом, неверно рассматривать событие data как логическое сообщение. Другими словами, одно событие socket.write на одном конце не соответствует одному событию data на другом. Одно событие data может содержать несколько сообщений, одно сообщение или только часть сообщения.

Хорошая новость в том, что эта проблема уже решена много раз. Я бы рекомендовал либо:

  • Использование библиотеки, предназначенной для передачи сообщений JSON по протоколу TCP.
  • Использование чего-то вроде Redis в качестве решения для обмена сообщениями pub-sub (этот вариант значительно упрощает масштабирование вашего приложения)
  • Если вы знаете, что ваши два приложения всегда будут работать на одном и том же компьютере, вам следует использовать встроенный узел Механизм IPC.
person josh3736    schedule 04.11.2014