【问题标题】:node.js net module pings and messages not happeningnode.js 网络模块 ping 和消息没有发生
【发布时间】:2014-11-04 18:23:48
【问题描述】:

我的服务器上有两个 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);});
});

我没有看到任何其他活动(没有 ping,后来在开放事件之后,没有 hello world)并且没有错误。

如果我使用console.dir(pull) 进行检查,我看不到接受数据的事件,即:ondata 或 onmessage

怎么了?

【问题讨论】:

    标签: node.js tcpserver qtcpsocket


    【解决方案1】:

    不幸的是,我必须指出,这种消息传递方案从根本上被破坏了。你正在使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-24
      • 2016-05-11
      • 1970-01-01
      相关资源
      最近更新 更多