与NodeJS进行TCP / IP通信以进行多次写入消息

时间:2015-02-01 05:33:51

标签: python node.js sockets tcp

我正在使用python over TCP / IP构建分布式缓存系统,我已经使用python实现了TCP SERVER,我正在为Python,PHP和NodeJS创建TCP客户端库。

因此客户端将使用a请求缓存项,并且TCP服务器将缓存值返回给客户端

我遇到NodeJS的一个问题,因为它是一个基于异步事件的编程工具。

以下是PHP客户端库的伪代码

$server = new CacheServer();
$server->connect("<host>", "<port>");
$value_1 = $server->get("<cache_key_1>")
$value_2 = $server->get("<cache_key_2>")

所以$ server-&gt; get方法首先在套接字e.g. "GET <cache_key_1>"上写一条消息 然后侦听套接字以便服务器响应,然后返回该缓存键的值 然后才转到<cache_key_2>

但是对于NodeJS,因为它基于事件,所以<cache_key_1><cache_key_2>的请求都是在不等待服务器响应的情况下发送的。

套接字从服务器返回两个值,但我无法区分哪个值适合哪个请求。我知道TCP套接字请求是排队的,所以我可能需要跟踪哪个请求是先发送的,就像在数组中一样,并有另一个响应数组然后映射它们。

有没有一种我无法看到的简单方法?

总之,我希望使用NodeJS从TCP客户端发送多个写入消息,并在每个&#34;写入&#34;之间等待服务器的响应。消息

任何帮助将不胜感激 谢谢!

1 个答案:

答案 0 :(得分:1)

<强>观

使用套接字处理异步时,想法是使用标识符标记请求,并为该标识符注册处理程序,并在收到响应时,我们与注册的标识符匹配。这是因为我们没有将套接字概念化为请求/响应。

这是一个样本库模块(reservoir.js):

var net = require('net');

module.exports = {
    client: {},
    connect: function(port, host, then) {
        var $this = this;
        var client = net.Socket();

        client.connect(port, host, function(){
            then && then();
        });

        client.on("data", function(data) {
            $this._process(data);
        });

        this.client = client;
        return this;
    },
    get: function(key, then) {
        var $this = this;
        $this.client.write(key, function() {
            $this._handle(key, then);
        });
        return this;
    },
    _handlers: {},
    _commands: ['GET', 'SET', 'DEL'],
    _handle: function(key, handler) {
        //remove commands from the key, because server doesn't return them (you can check here if its a valid command)
        var keyParts = key.split(' ');
        keyParts.shift();

        this._handlers[keyParts] = handler;
    },
    _process: function(data) {
        var response = JSON.parse(data.toString());
        var handler = this._handlers[response.incoming_message];
        if (handler) {
            if (response.message) {
                handler(null, response.message);
            } else {
                handler(new Error(response.error), null);
            }
        }
        delete this._handlers[response.incoming_message];
    }
};

这里我们使用关联的密钥注册每个回调 - 所以当我们收到数据时,我们会启动特定的处理程序。

在模块文件中的所有抽象之后,以下是它的使用方法:

var reservoir = require('reservoir');
var onConnect = function() {
    console.log("\nConnected.");
    reservoir.get('GET pk_movie', function(err, response) {
        console.log(response);
    });
}
reservoir.connect('3000', 'your-host.com', onConnect);

希望有所帮助!