【问题标题】:Is it possible for a TIdServerContext to be used more than once at the same time?是否可以同时使用 TIdServerContext 多次?
【发布时间】:2017-01-21 19:43:31
【问题描述】:

现在我知道在 Indy HTTP 服务器 (TIdHTTPServer) 上,TIdServerContext 被重新用于来自特定客户端的多个请求。但是,在设计工作方式时,我需要知道多个请求是否有可能使用相同的上下文类相互重叠?

例如,想象一下在浏览器中键入一个 URL 并一遍又一遍地按刷新。我看到的是创建了多个上下文类。但是,恐怕在某个地方,同一个上下文实例可能会同时处理两个请求。

这有可能发生吗?或者说一个实例永远不会同时处理多个请求是否安全?我几乎可以肯定是后者,考虑到上下文是它自己的线程,但我需要确定。

【问题讨论】:

  • 本质上你是在询问上下文是否可以与多个线程相关联。我想你知道答案。

标签: delphi indy httpserver


【解决方案1】:

现在我知道在 Indy HTTP Server (TIdHTTPServer) 上,TIdServerContext 被重新用于从特定客户端传入的多个请求。

仅当客户端和服务器使用 HTTP keep-alives 时,才能通过单个 TCP 连接发送多个请求。否则,每次响应后连接都会关闭。

但是,在设计工作方式时,我需要知道多个请求是否有可能使用同一个上下文类相互重叠?

没有。 Indy 上下文对象是在每个连接的基础上创建的,它们一次在单个线程上运行,并且 HTTP 1.1 和更早版本的请求一次处理一个连接(HTTP 2 允许并行多个请求,但 Indy 不允许此时实现 HTTP 2)。

例如,想象一下在浏览器中键入一个 URL 并一遍又一遍地按刷新。我看到的是创建了多个上下文类

在刷新时,浏览器正在关闭当前连接并创建一个新连接。关闭连接是取消尚未完成的挂起请求的唯一方法。

但是,我担心在某个地方,同一个上下文实例可能会同时处理两个请求。

这是不可能的。

这可能发生吗?

没有。

或者说一个实例永远不会同时处理多个请求是否安全?

是的。它可能在其生命周期内处理多个请求,但不能并行处理。

考虑到上下文是它自己的线程,我几乎可以肯定是后者

上下文不是线程。更准确地说,上下文表示一个特定的连接,它恰好由一个线程提供服务。 Indy 可以重用线程(如果您将线程池调度程序分配给服务器),其中给定线程可能在其生命周期内服务多个上下文。但 Indy 不会为多个连接重用上下文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2021-06-11
    • 2014-06-16
    • 2020-12-30
    • 2020-07-14
    • 2021-01-10
    相关资源
    最近更新 更多