Net套接字-确定在套接字on("data")下当前正在响应哪个请求
net socket - determining which request is currently being responded to under socket.on("data")
我正在尝试编写一个自定义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,以便在给定请求(无论出于何种原因)没有响应时不会泄漏内存。
相关文章:
- 如何使用HTML5与UDP套接字通信
- 在node.js中写入ECONNRESET错误和套接字连接检查
- java,javascript签名的小程序(文件选择,ftp上传)安全性/套接字异常
- 套接字服务器向客户端广播,但不从两者接收
- 如何确定套接字中的变量是否匹配
- 如何通过网络套接字连接到树莓派上的Mosquitto经纪人
- 快速的套接字 io 实例/中间件
- PHP:Web套接字和html 5
- 无法从客户端发出套接字消息
- STOMP web套接字回调不'不起作用
- Will my'新对象'在套接字断开连接时被垃圾收集
- 套接字服务器在本地获得500毫秒的往返时间
- 将服务器托管的Web应用程序连接到本地Web套接字
- 通过套接字发送画布元素,JS中的最大堆栈大小
- 如何使用套接字将node.js与ada连接起来
- 套接字io客户端网络::ERR_CONNECTION_REFUSED
- 节点.js设置套接字 ID
- node.js 需要太多的 TCP 套接字
- 从一个套接字发出两个事件
- 套接字.io错误:请求“socket”失败.从“root"