1
如何從twisted.web.client.Agent訪問底層套接字?我需要在這個套接字上啓用TCP_NODELAY。twisted.web.client.Agent的訪問套接字選項
如何從twisted.web.client.Agent訪問底層套接字?我需要在這個套接字上啓用TCP_NODELAY。twisted.web.client.Agent的訪問套接字選項
不幸的是,代理並不像它直接使用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請求的傳輸。不過,這可能不是一個聰明的想法。
不要忘記'_'的意思是「私人」。 – 2011-04-28 11:38:45
@JP:我的實用主義者經常與我想要不違反API約定的圖書館維護者交戰。不幸的是,實用主義者經常獲勝。既然您對Twisted有更多的個人知識,您是否碰巧知道爲什麼在客戶端中將「協議」屬性標記爲私有?這與許多其他工廠類型的對象有些不一致。 – Crast 2011-05-03 22:12:58