我正在使用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;之间等待服务器的响应。消息
任何帮助将不胜感激 谢谢!
答案 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);
希望有所帮助!