2011-04-27 48 views

回答

4

不幸的是,代理並不像它直接使用Protocol實例那樣容易,但也不是不可能。

的關鍵就在這裏,在代理的類定義:

_protocol = HTTP11ClientProtocol 

爲了獲得訪問您可以覆蓋connectionMade上HTTP11ClientProtocol運輸,以及代理。

所以你最終的東西,如:

from twisted.web import client 
class MyHTTPClient(client.HTTP11ClientProtocol): 
    def connectionMade(self): 
     self.transport.setTcpNoDelay(True) 
     client.HTTP11ClientProtocol.connectionMade(self) # call the super-class's connectionMade 

class MyAgent(client.Agent): 
    _protocol = MyHTTPClient 

現在使用MyAgent代替代理的,你會在客戶端上獲得TCP NODELAY。

**注**,這不是唯一的方法來做到這一點,但有一種方法可以做到這一點,並繼續使用Agent.request。或者,編寫自己的代理程序處理請求並將其連接到客戶端,並將請求連同TCP節點連接在延遲鏈中。

** Note 2 **在這種情況下,假設'transport'有setTcpNoDelay()方法是很好的,因爲這是一個非常合理的假設,您將使用TCP作爲HTTP請求的傳輸。不過,這可能不是一個聰明的想法。

+1

不要忘記'_'的意思是「私人」。 – 2011-04-28 11:38:45

+0

@JP:我的實用主義者經常與我想要不違反API約定的圖書館維護者交戰。不幸的是,實用主義者經常獲勝。既然您對Twisted有更多的個人知識,您是否碰巧知道爲什麼在客戶端中將「協議」屬性標記爲私有?這與許多其他工廠類型的對象有些不一致。 – Crast 2011-05-03 22:12:58