Net套接字-确定在套接字on("data")下当前正在响应哪个请求

net socket - determining which request is currently being responded to under socket.on("data")

本文关键字:quot 套接字 响应 请求 on data Net      更新时间:2023-09-26

我正在尝试编写一个自定义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();
}

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

然后,您可以从标签中识别哪个响应是哪个响应。当您发送请求时,您将生成一个新的唯一请求ID,并将其添加到Map中。然后,当您获得响应时,您查看响应中的惟一id,在Map中查找它,然后调用与该惟一id关联的回调。

在给定约束条件下,没有其他方法可以知道哪个响应与哪个请求对应。您必须人为地在请求和响应之间创建映射,并且您需要响应服务器通过返回惟一标识来配合,以便完成此操作。

您可能还需要在Map中超时id,以便在给定请求(无论出于何种原因)没有响应时不会泄漏内存。