使用urllib2加载URL时,如何设置TCP_NODELAY标志?

2024-05-19 00:01:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用urllib2加载网页,我的代码是:

httpRequest = urllib2.Request("http:/www....com")
pageContent = urllib2.urlopen(httpRequest)
pageContent.readline()

如何获取套接字属性以设置TCP_NODELAY

在正常的套接字中,我将使用函数:

socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

Tags: 代码comhttp网页readline属性requestwww
3条回答

你一定要用urllib2吗?

或者,可以使用httplib2,它设置了TCP_NODELAY选项。

https://code.google.com/p/httplib2/

它给你的项目增加了依赖性,但看起来不像猴子修补那么脆弱。

对于请求,类似乎在request.packages.urllib3中,有2个类, HTTPConnection和HTTPSConnection。它们应可在模块顶层进行MonkeyPatch:

from requests.packages.urllib3 import connectionpool

_HTTPConnection = connectionpool.HTTPConnection
_HTTPSConnection = connectionpool.HTTPSConnection

class HTTPConnection(_HTTPConnection):
    def connect(self):
        _HTTPConnection.connect(self)
        self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

class HTTPSConnection(_HTTPSConnection):
    def connect(self):
        _HTTPSConnection.connect(self)
        self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

connectionpool.HTTPConnection = HTTPConnection
connectionpool.HTTPSConnection = HTTPSConnection

如果需要访问所用套接字上的此类低级属性,则必须重载某些对象。

首先,您需要创建一个HTTPHandler的子类,标准库中的子类可以:

class HTTPHandler(AbstractHTTPHandler):

    def http_open(self, req):
        return self.do_open(httplib.HTTPConnection, req)

    http_request = AbstractHTTPHandler.do_request_

如您所见,它使用HTTPConnection打开连接。。。您还必须重写它;)才能升级connect()方法。

像这样的事情应该是个好的开始:

class LowLevelHTTPConnection(httplib.HTTPConnection):

    def connect(self):
        httplib.HTTPConnection.connect(self)
        self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)


class LowLevelHTTPHandler(HTTPHandler):

    def http_open(self, req):
        return self.do_open(LowLevelHTTPConnection, req)

urllib2足够聪明,可以让您对某个处理程序进行子类化,然后使用它,urllib2.build_opener是为此而创建的:

urllib2.install_opener(urllib2.build_opener(LowLevelHTTPHandler)) # tell urllib2 to use your HTTPHandler in replacement of the standard HTTPHandler
httpRequest = urllib2.Request("http:/www....com")
pageContent = urllib2.urlopen(httpRequest)
pageContent.readline()

相关问题 更多 >

    热门问题