访问twisted.web.client.Agent的套接字选项

1 投票
1 回答
868 浏览
提问于 2025-04-16 16:33

我该如何从twisted.web.client.Agent访问底层的socket?我需要在这个socket上启用TCP_NODELAY。

1 个回答

4

很遗憾,使用Agent并没有像直接使用Protocol实例那样简单,但也不是不可能。

关键在于Agent的类定义:

_protocol = HTTP11ClientProtocol

为了访问传输层,你可以重写HTTP11ClientProtocol中的connectionMade方法,以及Agent。

所以你最终会得到类似这样的代码:

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替代Agent,你就能在客户端实现TCP的无延迟。

** 注意 **,这并不是唯一的方法,但这是你可以用来继续使用Agent.request的一种方式。或者,你也可以自己写一个代理,来构建请求并连接到客户端,同时在一个延迟链中设置你的请求和TCP无延迟。

** 注意2 ** 在这种情况下,可以假设'transport'有一个 setTcpNoDelay() 方法,因为假设你会使用TCP作为HTTP请求的传输方式是相当合理的。不过,这在整个twisted中可能并不是个好主意。

撰写回答