gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:51:49 24 4
gpt4 key购买 nike

我正在使用基于 TCP/IP 的 python 构建分布式缓存系统,我已经使用 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->get 方法所做的是首先在套接字 e.g. "GET <cache_key_1>" 上写入一条消息然后在套接字上监听服务器响应,然后返回该缓存键的值然后才转到<cache_key_2>

但是对于NodeJS,因为它是基于事件的,所以对于<cache_key_1>的请求都是和 <cache_key_2>无需等待服务器响应即可发送。

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

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

总而言之,我想使用 NodeJS 从 TCP 客户端发送多个写入消息,并在每个“写入”消息之间等待服务器返回的响应

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

最佳答案

想法

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

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

希望对您有所帮助!

关于python - 与 NodeJS 的 TCP/IP 通信以获取多个写入消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28259823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com