我正在尝试使用 keep-alive 请求编写一个在 node.js 中使用的自定义 http get 函数。我将通过单个 TCP 套接字同时向单个主机发送多个请求。我如何确定当前哪个响应正在通过 socket.on("data")
发出数据?每个请求是否一次处理一个,或者是否有可能多个请求最终同时响应数据?如果这不是问题,并且一次仅通过 socket.on("data")
发出一个请求的数据,那么我如何确定正在响应哪个请求,以及该请求何时响应已完成返回数据,如何执行该请求的特定回调?
这是我目前的代码:
var net = require("net");
var clients = {};
function get(url, callback) {
var protocol = url.split("://")[0];
var host = url.split("://")[1].split("/")[0];
var path = "/"+(url.split("://")[1]).split(/\/(.+)?/)[1];
var client = clients[host];
function loadPage(data) {
var rawRequest = "GET "+url+" HTTP/1.1\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.80 Safari/537.36\nhost: "+host+"\nCookie: \ncontent-length: 0\nConnection: keep-alive\r\n\r\n";
client.socket.write(rawRequest);
}
if (!client) {
clients[host] = {
socket:new net.Socket()
callbacks:[]
}
client = clients[host];
client.socket.connect(80, host, function() {
loadPage();
}
}
loadPage();
}
最佳答案
如果您通过同一个套接字发送多个请求并接收多个响应,并且无法保证响应按顺序返回,那么识别哪个响应与哪个请求对应的唯一方法就是使用唯一的标记它们请求中的 ID(可能带有查询参数或自定义 header ),并让您正在联系的服务器在响应中包含该特定标记。
然后,您可以识别哪个响应来自标记。当您发送请求时,您会生成一个新的唯一请求 ID,并将其及其附带的回调添加到 Map
。然后,当您收到响应时,您会查看响应中的 uniqueID,在 Map
中查找它,然后调用与该 uniqueID 关联的回调。
在给定约束的情况下,没有其他方法可以知道哪个响应与哪个请求对应。您必须人为地创建请求和响应之间的映射,并且需要响应服务器通过返回 uniqueID 来配合才能完成此操作。
您可能还必须使映射中的 ID 超时,这样如果给定请求没有响应(无论出于何种原因),您就不会泄漏内存。
关于javascript - net socket - 确定当前正在 socket.on ("data"下响应哪个请求),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39240229/