2017-01-21 44 views
0

現在我知道在Indy HTTP Server(TIdHTTPServer)上,TIdServerContext被重新用於來自特定客戶端的多個請求。但是,在設計事情的工作方式時,我需要知道多個請求是否可能使用相同的上下文類彼此重疊?TIdServerContext是否可以同時使用多次?

例如,假設在瀏覽器中輸入網址並反覆按刷新。我看到發生的是創建多個上下文類。但是,我擔心在某個地方,同一個上下文實例可能會被用來同時處理兩個請求。

這可能發生嗎?或者可以肯定地說一個實例永遠不會同時處理多個請求嗎?我幾乎肯定它是後者,考慮到上下文是它自己的線索,但我需要確定。

+0

基本上,你問的上下文是否可以與多個線程關聯。我想你知道這個答案。 –

回答

6

現在我知道在Indy HTTP服務器(TIdHTTPServer)上,TIdServerContext被重新用於來自特定客戶端的多個請求。

只有當客戶端和服務器正在使用HTTP保持活動狀態時,才能通過單個TCP連接發送多個請求。否則,每次響應後關閉連接。

但是,在設計工作方式時,我需要知道多個請求是否可能使用相同的上下文類相互重疊?

編號Indy上下文對象是基於每個連接創建的,它們一次在單個線程上運行,並且每個連接一次處理一個HTTP 1.1和更早的請求(HTTP 2允許多個並行請求,但Indy此時不執行HTTP 2)。

例如,假設在瀏覽器中輸入一個URL,一遍又一遍刷新壓制。我看到發生的事情是創建多個上下文類

刷新時,瀏覽器正在關閉當前連接並創建一個新連接。關閉連接是取消尚未完成的待處理請求的唯一方法。

但是,我怕什麼地方,相同的上下文實例可以用於處理在同一時間兩個請求。

這是不可能的。

這可能發生嗎?

抑或是肯定地說,一個實例將永遠不會處理在同一時間多個請求?

是的。它可能在其生存期內處理多個請求,但不是並行處理。

我幾乎可以肯定是後者,考慮到上下文是它自己的線程

的背景是不是一個線程。更準確地說,上下文表示一個特定的連接,它恰好只由一個線程提供服務。 Indy可以重用線程(如果將線程池調度程序分配給服務器),其中給定線程可以在其生命週期中服務多個上下文。但是Indy不會重複使用多個連接的上下文。

相關問題