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。