我在服务器上并排运行了两个node.js应用程序,并且我不想使用本机node.js(v0.10.33)模块net <轻量级地在它们之间发送服务器端消息/ p>
我打算让第一个应用程序向第二个发送消息。我看到控制台日志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);});
});
我没有看到任何其他活动(没有ping,后来在开放事件之后,没有hello世界)并且没有错误。
如果我使用console.dir(pull)
进行检查,我不会看到接受数据的事件,即:ondata或onmessage
有什么问题?
答案 0 :(得分:0)
不幸的是,我必须指出这种消息传递方案从根本上被打破了。您正在使用TCP which provides a stream of bytes, not messages。
尽管TCP通过IP数据包发送数据,但TCP 不数据包协议。 TCP套接字只是数据的流。因此,将
data
事件视为逻辑消息是不正确的。换句话说,一端的socket.write
与另一端的data
事件不等同。单个data
事件可能包含多个消息,单个消息或仅包含消息的一部分。
好消息是这个问题已经解决了很多次。我建议: