现在我知道在Indy HTTP Server(TIdHTTPServer
)上,TIdServerContext
被重用于来自特定客户端的多个请求。但是,在设计工作原理时,我需要知道多个请求是否可能使用相同的上下文类相互重叠?
例如,假设在浏览器中键入URL并反复按刷新。我看到的是创建了多个上下文类。但是,我担心在某个地方,可能会使用相同的上下文实例同时处理两个请求。
这可能发生吗?或者说一个实例永远不会同时处理多个请求是否安全?我几乎肯定它是后者,考虑到上下文是它自己的线程,但我需要确定。
答案 0 :(得分:6)
现在我知道在Indy HTTP Server(TIdHTTPServer)上,TIdServerContext会重复用于从特定客户端传入的多个请求。
仅当客户端和服务器使用HTTP保持活动时,才能通过单个TCP连接发送多个请求。否则,每次响应后关闭连接。
然而,在设计工作原理时,我需要知道多个请求是否可能使用相同的上下文类相互重叠?
没有。 Indy上下文对象是基于每个连接创建的,它们一次在一个线程上运行,并且每个连接一次处理一个HTTP 1.1和更早的请求(HTTP 2允许并行多个请求,但Indy不此时实现HTTP 2。)
例如,假设在浏览器中键入URL并反复按刷新。我看到的是多个上下文类被创建
在刷新时,浏览器正在关闭当前连接并创建一个新连接。关闭连接是取消尚未完成的待处理请求的唯一方法。
但是,我担心在某个地方,可能会使用相同的上下文实例同时处理两个请求。
这是不可能的。
这可能发生吗?
没有
或者说一个实例永远不会同时处理多个请求是否安全?
是。 可能在其生命周期内处理多个请求,但不能并行处理。
我几乎可以肯定它是后者,考虑到上下文是它自己的线程
上下文不是线程。更准确地说,上下文代表一个特定的连接,恰好只由一个线程提供服务。 Indy可以重用线程(如果您将线程池调度程序分配给服务器),其中给定线程可以在其生命周期内为多个上下文提供服务。但Indy不会重复使用上下文进行多重连接。