Asynchronous Node.js TCP客户端命令/响应

Asynchronous Node.js TCP客户端命令/响应,asynchronous,node.js,tcp,client,Asynchronous,Node.js,Tcp,Client,我有一个简单的服务器,您向它发送一个命令,它会以\r\n分隔的响应返回 所以我尝试在我的客户机上获取一个命令回调方法。查看此简化代码段: var net = require('net'); var Client = function() { this.data = ""; this.stream = net.createConnection(port, host); this.stream.on('data', function( data ) { var

我有一个简单的服务器,您向它发送一个命令,它会以\r\n分隔的响应返回

所以我尝试在我的客户机上获取一个命令回调方法。查看此简化代码段:

var net = require('net');

var Client = function() {
   this.data = "";
   this.stream = net.createConnection(port, host);

   this.stream.on('data', function( data ) {
        var self = this;

        this.data += data;
        self.process()            
   };

   this.process = function() {
       var _terminator = /^([^\r\n]*\r\n)/;

       while( results = _terminator.exec(this.data) ) {
            var line = results[1];
            this.data = this.data.slice(line.length);

            this.emit('response', data);
       };
   };

   this.sendCommand = function( command, callback ) {
       var self = this;

       var handler = function( data ) {
            self.removeListener('response', handler);

            callback && callback(data);
       }

       this.addListener('response', handler);

       this.stream.write(command);
   };

   this.command_1 = function( callback ) {
        this.sendCommand( 'test', callback );
   };

   this.command_2 = function( callback ) {
        this.sendCommand( 'test2', callback );
   };
}
所以我在做一个client.command_1函数{},然后是client.command_2函数{},但是在我的command_2的回调中,我得到了command_1的响应

这是实现这种事情的正确方法吗?

当您执行

client.command_1( function() { 1; } );
client.command_2( function() { 2; } );
您将两个回调都添加为“result”侦听器,当第一次发出“result”时,两个回调都被调用,然后第一个回调从列表中删除自己。您需要在某种请求对象上设置回调,而不是在客户端上

关于客户端中发生的情况的简单代码:

var e = new EventEmitter();
e.on('result', function() { console.log(1); });
e.on('result', function() { console.log(2); });
// ...
e.emit('result'); // here we trigger both callbacks which result in printing "1\n2\n"

你到底想造什么?!有这么多好的节点模块,你可以使用。。。你看过socket.io之类的东西吗?这是一个很好的模块,可以做实时的事情,比如聊天等等。我知道,但我正在尝试熟悉像这样的构建。我首先想到的是Socket.io:Socket.io就是要在浏览器和服务器之间使用相同的api进行双向通信。它是一个包装器,用于隐藏浏览器的差异以及不同浏览器可以使用的不同传输。如果你想要服务器到服务器的通信,你有更多的选择WebSockets、http、rpc、xmlrpc、你自己的协议、消息队列——你可以说itI非常确定这是真的,我需要一些帮助来摆脱我的循环。谢谢: