python - 是否可以覆盖请求中的默认套接字选项?

标签 python sockets tcp

我使用优秀的 python 请求库为 rest API 编写了一个非常简单的客户端。一切都很好 util 我通过负载均衡器运行客户端,它会理智地检测空闲的 tcp 连接并杀死它们。我希望我的客户端使用一些不同于我平台 (linux) 上的默认设置的 tcp 保持事件选项。但是我没有看到任何简单的方法来告诉套接字库我想为新套接字选择一些默认选项。

当直接使用 socket.create_connection 时,使用装饰器很容易做到这一点,但我不知道当实际调用被埋在某些第 3 方库中时,我如何使装饰调用可用,就像请求。

提前致谢

最佳答案

较新版本的 urllib3(从 1.8.3 开始,2014 年 6 月 23 日发布)支持设置套接字选项。

您可以通过创建自定义适配器从 requests(自 2.4.0 起,2014 年 8 月 29 日发布)设置这些选项:

class HTTPAdapterWithSocketOptions(requests.adapters.HTTPAdapter):
    def __init__(self, *args, **kwargs):
        self.socket_options = kwargs.pop("socket_options", None)
        super(HTTPAdapterWithSocketOptions, self).__init__(*args, **kwargs)

    def init_poolmanager(self, *args, **kwargs):
        if self.socket_options is not None:
            kwargs["socket_options"] = self.socket_options
        super(HTTPAdapterWithSocketOptions, self).init_poolmanager(*args, **kwargs)

然后您可以将此适配器挂载到需要自定义套接字选项的 session (例如设置SO_KEEPALIVE):

adapter = HTTPAdapterWithSocketOptions(socket_options=[(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)])
s = requests.session()
s.mount("http://", adapter)
s.mount("https://", adapter)

关于python - 是否可以覆盖请求中的默认套接字选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15148225/

相关文章:

python - 在双重条件下应用 AND 运算符

python - 如何在 Django 模板中显示多个 View ?

c - Linux读取函数实现

c - 我怎样才能通过套接字通过互联网连接到我的 friend ?

python - 导入 h2o 时为 "Could not establish link to the H2O cloud http://127.0.0.1:54321 after 20 retries"

python - 使用Python通过HTTP代理通过HTTP获取FTP url

c - 套接字编程代码在 XP 上执行但在 Windows 7 上失败

sockets - React-Native:语音聊天

java - TCP:当服务器监听随机端口时,客户端如何知道要发送到哪个端口?

ssl - 反向代理 : How to relay (encrypted) SSL traffic to a (decrypted) TCP connection?