Javascript 在不打开新连接的情况下发出HTTP请求
如果浏览器打开到远程服务器的连接,是否可以通过Javascript访问相同的连接 我在我的网络上有一个小的以太网模块,我的编程有点像这样(伪代码): 关键是它在一个套接字上侦听HTTP请求并为其提供服务 在我的web浏览器中,我可以连接到设备,对我编写的一些HTML/JS发出HTTP GET请求,并且可以正常工作。在套接字上打开连接,文件作为HTTP响应返回 现在我想单击网页上的一个按钮,让浏览器通过同一个连接发送HTTP POST请求。在我的Javascript中,我(为了清晰起见进行了编辑和格式化):Javascript 在不打开新连接的情况下发出HTTP请求,javascript,http,tcp,Javascript,Http,Tcp,如果浏览器打开到远程服务器的连接,是否可以通过Javascript访问相同的连接 我在我的网络上有一个小的以太网模块,我的编程有点像这样(伪代码): 关键是它在一个套接字上侦听HTTP请求并为其提供服务 在我的web浏览器中,我可以连接到设备,对我编写的一些HTML/JS发出HTTP GET请求,并且可以正常工作。在套接字上打开连接,文件作为HTTP响应返回 现在我想单击网页上的一个按钮,让浏览器通过同一个连接发送HTTP POST请求。在我的Javascript中,我(为了清晰起见进行了编辑和
这里的问题是,这会打开到设备的新连接,但我想使用浏览器已经连接到的同一个套接字。这是否可能,如果可能,如何实现?浏览器中没有应用程序控件来决定是否将新连接用于下一个请求或是否使用现有连接。事实上,浏览器将并行使用多个连接到同一台服务器是完全正常的,您的服务器必须能够处理这一问题
由于您的服务器体系结构似乎一次只能处理一个连接,因此您需要更改体系结构以处理多个并行连接,或者确保一次只需要处理一个连接。后者可以通过不支持HTTP保持活动来实现,即在每次响应后立即关闭连接。这样,新请求将产生一个新连接(根据您的问题,这不是您想要的),但您的服务器也将能够处理这个新连接(这是您可能最终需要的),因为上一个连接已关闭。我已经计算出打开第二个套接字(例如,在端口81上)并发布到
http://192.168.1.99:81
确实有效。但是,我仍然希望在不打开单独插座的情况下执行此操作。谢谢您的回复。听起来我要么A)强制关闭服务器端的连接,然后在每次传输后重新打开套接字,要么B)确保服务器端始终打开一个额外的套接字,以便浏览器有位置发送请求。方法A看起来很合理,但可能效率很低?(听起来不像是这些连接的使用方式。)方法B听起来也很合理,但我对套接字有限制,我如何知道浏览器何时会使用一个打开的套接字,而不是尝试使用一个新的套接字?@nullromo:with B)你不仅需要一个备用套接字,通常还需要多个套接字(它们通常会打开4个并行连接)您还需要并行处理这些连接上的请求。A) 因此更简单,但是是的,它会增加为每个新请求创建新连接的开销,如果客户端和服务器之间存在更高的延迟,这尤其是一个问题。
private var socket
while(true) {
if(socket is disconnected) {
open socket
listen on socket (port 80)
}
if(connection interrupt) {
connect socket
}
if(data receive interrupt) {
serve
}
if(disconnection interrupt) {
disconnect socket
}
}
// This function sends an HTTP request
function http(type, url, data, callbacks) {
// make a new HTTP request
var request = new XMLHttpRequest();
// open a connection to the URL
request.open(type, url + (data ? "?" + data : ""));
// add headers
if(type == "POST")
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// register callbacks for the request
Object.keys(callbacks).forEach(function(callback) {
request[callback] = function() {
callbacks[callback](request.responseText);
};
});
// send and return the request
request.send();
return request;
}
// Here is where I call the function
http("POST", // use POST method
"http://192.168.1.99", // IP address of the network device
dataToSend, // the data that needs to be sent
{ // callbacks
onloadend: function(data) {
console.log("success. got: " + data); // print 'success' when the request is done
},
onerror: function(data) {
console.log("There was an error."); // print 'error' when it fails
console.log(data);
}
}
);