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

标签 javascript node.js sockets

我正在尝试使用 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/

相关文章:

javascript - 编辑选项仅对在 php 中上传的用户可见

javascript - 如何使用 javascript 字典中的键查找值

javascript - 如何制作一个捕捉到浏览器每一侧的捕捉标题?

node.js - 无法在nodejs中导入模块 'handler' aws lambda函数

ios - 在 AppDelegate 中连接时获取套接字输入时出错

javascript - 压缩 HTML 和 Javascript

javascript - 咕噜声 : grunt-hub isn't watching all projects

java - 使用 Socket 将 Android 应用程序(带 Flex)连接到 Java 服务器?

linux - 如果我使用不同于 224.0.0.1 的地址,则不会发送多播数据包

Node.js 支持跨服务器多负载均衡?