XMLHttpRequest在请求处理后是否保持连接开启?

7

我已经完成了一个简单的ajax请求...

请求和响应头都包含Connection: Keep-Alive

我搜索了一下,发现客户端与服务器之间保持了一个持久连接。这支持流水线操作,其中客户端可以发送多个请求而不必等待每个响应。

所以我有几个问题:

  1. xmlhttprequest实际上在哪里打开到服务器的连接?
  2. 创建许多xmlhttprequest对象是否会打开它们自己的连接,还是使用流水线技术在同一个连接上发送它们?
  3. 我想处理同时发生的请求。我可以将请求排队(存储参数),并在onreadystate中提供处理它的函数。也就是说,递归调用发出请求的函数,这样做好吗?或者根本不是一个好主意?
  4. 连接何时关闭?在什么阶段?

其他信息: 我不想使用jquery或任何其他库进行ajax。你可以提出建议,我可以查看它们的工作方式。 我正在使用javascript和php(codeigniter框架)。 我希望能够处理多个请求(2),并在达到限制时排队请求。

先谢谢你啦 :)


你了解 HTTP 请求是通过使用“TCP 连接”来完成的吗?HTTP 使用 TCP 就像传真使用电话线一样。在“Connection: Keep-Alive”中所指的就是“TCP 连接”。你无法确切知道浏览器何时或在何处决定创建一个 TCP 连接,但通常,如果有利于连接,浏览器会创建多个同时的 TCP 连接到服务器。对于 HTML、图片、CSS、Ajax 请求等,所有请求都通过同一条线路发送(尽管浏览器通常会打开多条线路)。 - goat
谢谢回复。是的,我知道它是通过Tcp连接进行的。感谢您对Connection: Keep-Alive的澄清。我已经阅读过标准是2个同时连接,尽管有些浏览器支持更多。 - Alan Tyloo
1个回答

2

XMLHttpRequest是一个对象,它使您可以在不刷新页面的情况下从服务器请求和接收数据。它使用HTTP或HTTPS请求。它基本上与请求和接收HTML页面相同。您可以同步或异步打开它们。

XMLHttpRequest.open( Method, URL, Asynchronous, UserName, Password )

这里的Method是要使用的HTTP请求方法。请参见http://www.w3.org/TR/XMLHttpRequest/#the-open()-method

我想处理同时发生的请求.. 我可以将请求排队(存储参数)..并在onreadystate提供处理函数..即递归调用发出请求的函数吗?或者这根本不是一个好主意?

我会创建一个XMLHttpRequests数组,并在onreadystatechange中处理数据并从数组中删除XMLHttpRequest。请记住,您将收到异步响应的混合顺序,或者可能根本不会收到响应。

连接何时关闭..在什么阶段?

在接收到数据后立即关闭。请注意,keep-alive是关于保持会话活动,而不是连接。


不是我做的。感谢您的回复。我会进一步了解它。 - Alan Tyloo
Alan,欢迎。我只是好奇,因为如果我的回答有什么问题,我不想误导任何人,并且我想从我的错误中学习。 - Ertug
22
请注意,keep-alive 是指保持 (TCP) 连接的活跃状态,不是与会话有关。所谓的“会话”并不存在。 - Orwellophile
@Orwellophile,根据你的处理方式,TCP就是在IP上的会话 :) - pavel_karoukin
@pavel_karoukin,同意。但是http是在tcp层上进行1个或多个连续(且部分并行)事务 - Orwellophile
3
从技术上讲,我不同意。TCP是运输机制(第4层),在IP之上提供可靠的连接。建立新的TCP连接会带来开销,因此您希望尽可能保持它的开放状态。一个会话将完全依托于TCP连接(第5层),通常不适用于HTTP请求,因为HTTP通常在应用层(第7层)操作。因此,“keep_alive”就是尽可能保持连接活动状态。仅HTTP请求会关闭。 - Eric Spreen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接