node.js net модул пингове и съобщения не се случват

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

Възнамерявам първото приложение да изпраща съобщения до второто. Виждам регистрационния файл на конзолата 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