2014-11-04 10 views
0

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

Я предполагаю, что первое приложение отправит сообщения второму. Я вижу в журнале консоли 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);}); 
}); 

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

Если я осмотреть с console.dir(pull) я не вижу события для принятия т.е. данные: Ondata или OnMessage

Что не так?

ответ

0

К сожалению, я должен указать, что эта схема обмена сообщениями в основном нарушена. Вы используете TCP, which provides a stream of bytes, not messages.

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

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

  • Использование a library предназначено для передачи сообщений JSON через TCP.
  • Используя что-то вроде Redis в качестве решения паба-суб обмена сообщений (эта опция делает приложение гораздо проще масштабировать)
  • Если вы знаете, что ваши два приложения всегда будут работать на ту же машину, вы должны использовать узел built-in IPC mechanism.