TCP/IP 与 NodeJS 通信以获取多个写入消息

TCP/IP communications with NodeJS for multiple write messages

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

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

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

下面是 PHP 客户端库

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

所以 $server->get 方法所做的是首先在套接字上写入一条消息 e.g. "GET <cache_key_1>" 然后监听服务器响应的套接字,然后 return 该缓存键的值 然后才转到 <cache_key_2>

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

套接字从服务器读取两个值,但我无法区分哪个值是针对哪个请求的。我知道 TCP 套接字请求排队等候,所以我可能必须像在数组中一样跟踪首先发送的请求,并有另一个响应数组,然后映射这些请求。

有没有我看不到的更简单的方法?

总而言之,我想使用 NodeJS 从 TCP 客户端发送多个写入消息,并且 在每个 "write" 消息

之间等待来自服务器 的响应

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

想法

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

这是一个示例容器模块 (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);

希望对您有所帮助!