net socket - 确定socket.on(“data”)下当前正在响应哪个请求

时间:2016-08-31 03:22:53

标签: javascript node.js sockets

我正在尝试编写一个自定义的http get函数,以便在node.js中使用keep-alive请求。我将同时通过单个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();
}

1 个答案:

答案 0 :(得分:1)

如果您通过同一个套接字发送多个请求并接收多个响应,并且您无法保证响应按顺序返回,那么确定哪个响应与哪个请求一起使用唯一标记它们的唯一方法请求中的ID(可能带有查询参数或自定义标头)并让您联系的服务器在响应中包含该特定标记。

然后,您可以确定哪个响应来自标签。当您发送请求时,您会生成一个新的唯一请求ID,并将其与之后的回调添加到Map。然后,当您收到回复时,查看响应中的uniqueID,在Map中查找,然后调用与该唯一ID关联的回调。

没有其他方法可以知道在给定约束的情况下哪个响应与哪个请求有关。您必须人为地在请求和响应之间创建映射,并且您需要通过返回uniqueID来响应服务器以进行协作。

您可能还需要在地图中超时ID,这样如果没有来自给定请求的响应(无论出于何种原因),您就不会泄漏内存。