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);
希望对您有所帮助!
我正在使用 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);
希望对您有所帮助!