node.js网络模块ping和消息没有发生

问题描述:

我有两个node.js应用程序在我的服务器上并排运行,我不想通过使用本地node.js轻量级地在它们之间发送服务器端消息(v0.10.33)模块网node.js网络模块ping和消息没有发生

我打算第一个应用程序发送消息到第二个。我看到控制台日志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)检查我没有看到接收数据,即事件:昂达或的onMessage

有什么不对?

不幸的是,我必须指出,这个消息传递机制从根本上被打破。您正在使用TCP,which provides a stream of bytes, not messages

尽管TCP通过IP数据包发送其数据,但TCP是而不是的一种数据包协议。一个TCP套接字只是一个数据流。因此,将data事件视为逻辑消息是错误的。换句话说,一端的一个socket.write不等于另一端的单个data事件。单个data事件可能包含多个消息,单个消息或仅消息的一部分。

好消息是这是一个已经解决了很多次的问题。我建议:

  • 使用a library意味着通过TCP传递JSON消息。
  • 使用类似的Redis作为发布 - 订阅消息解决方案(此选项使您的应用程序更容易扩展)
  • 如果你知道你的两个应用程序将始终在同一台机器上运行,你应该使用节点的built-in IPC mechanism