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

时间:2014-11-04 18:23:49

标签: node.js tcpserver qtcpsocket

我在服务器上并排运行了两个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

有什么问题?

1 个答案:

答案 0 :(得分:0)

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

  

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

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

  • 使用a library用于通过TCP传递JSON消息。
  • 使用redis作为pub-sub消息传递解决方案(此选项使您的应用程序更容易扩展)
  • 如果您知道您的两个应用程序将始终在同一台计算机上运行,​​则应使用节点built-in IPC mechanism