代码之家  ›  专栏  ›  技术社区  ›  jdizzle

便秘的python urllib2插座

  •  0
  • jdizzle  · 技术社区  · 14 年前

    我一直在搜索因特网,寻找解决我的Python问题的方法。我正在尝试使用URLLIB2连接从HTTP服务器读取可能无限的数据流。这是一些交互通信的一部分,所以我能得到可用的数据是很重要的,即使不是整个缓冲区都满了。似乎没有办法 read \ readline 返回 可获得的 数据。它将永远阻塞等待整个(无穷无尽的)流,然后再返回。

    即使我使用fnctl将底层文件描述符设置为非阻塞,urllib2文件对象 仍然阻塞!! 一般来说,似乎没有办法使python文件对象 阅读 ,返回所有可用数据(如果有),否则阻止。

    我看到过一些关于寻求帮助的人的帖子,但我没有看到任何解决方案。给出了什么?我错过什么了吗?这看起来像是一个很正常的用例,完全毁了!我希望利用urllib2的能力来检测配置的代理并使用分块编码,但如果它不合作,我就不能。

    编辑:根据要求,这里有一些示例代码

    客户:

    connection = urllib2.urlopen(commandpath)
    id = connection.readline()
    

    现在假设服务器正在使用分块传输编码,并沿着流写入一个块,该块包含行,然后等待。连接仍处于打开状态,但客户端的数据在缓冲区中等待。

    我不能得到 阅读 要返回数据,我知道它正在等待,因为它试图读取数据,直到连接结束。在这种情况下,连接可能永远不会关闭,因此它也将等待 永远 或者在非活动超时之前,切断连接。一旦连接断开,它将返回,但这显然不是我想要的行为。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Wim    14 年前

    urllib2 在HTTP级别操作,它与完整的文档一起工作。我认为没有办法不侵入 ULLIb2 源代码。

    您所能做的就是使用普通的套接字(在本例中,您必须自己讨论HTTP),然后调用 sock.recv(maxbytes) 它只读取可用的数据。

    更新 :您可能想尝试呼叫 conn.fp._sock.recv(maxbytes) 而不是 conn.read(bytes) 关于一个 ULLIb2 连接。