使用Python读取HTTP服务器推送流

时间:2010-04-26 20:53:15

标签: python http server-push

我正在努力为一个网站编写客户端,该网站提供数据作为HTTP流(也称为HTTP服务器推送)。但是,urllib2.urlopen()以当前状态抓取流,然后关闭连接。我尝试直接跳过urllib2并使用httplib,但这似乎有相同的行为。

请求是一个包含五个参数的POST请求。但是,不需要cookie或身份验证。

有没有办法让流保持打开状态,所以可以检查每个程序循环中的新内容,而不是等待整个事情每隔几秒重新加载一次,引入滞后?

3 个答案:

答案 0 :(得分:1)

您是否需要实际解析响应标头,或者您是否主要对内容感兴趣?并且您的HTTP请求是否复杂,使您设置cookie和其他标题,还是一个非常简单的请求就足够了?

如果您只关心HTTP响应的主体并且没有非常奇特的请求,那么您应该考虑使用套接字连接:

import socket

SERVER_ADDR = ("example.com", 80)

sock = socket.create_connection(SERVER_ADDR)
f = sock.makefile("r+", bufsize=0)

f.write("GET / HTTP/1.0\r\n"
      + "Host: example.com\r\n"    # you can put other headers here too
      + "\r\n")

# skip headers
while f.readline() != "\r\n":
    pass

# keep reading forever
while True:
    line = f.readline()     # blocks until more data is available
    if not line:
        break               # we ran out of data!

    print line

sock.close()

答案 1 :(得分:1)

你可以试试requests lib。

import requests
r = requests.get('http://httpbin.org/stream/20', stream=True)

for line in r.iter_lines():
    # filter out keep-alive new lines
    if line:
        print line

您还可以添加参数:

import requests
settings = { 'interval': '1000', 'count':'50' }
url = 'http://agent.mtconnect.org/sample'

r = requests.get(url, params=settings, stream=True)

for line in r.iter_lines():
    if line:
        print line

答案 2 :(得分:0)

使用urllib2执行此操作的一种方法是(假设此站点还需要基本身份验证):

 import urllib2
 p_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
 url = 'http://streamingsite.com'
 p_mgr.add_password(None, url, 'login', 'password')

 auth = urllib2.HTTPBasicAuthHandler(p_mgr)
 opener = urllib2.build_opener(auth)

 urllib2.install_opener(opener)
 f = opener.open('http://streamingsite.com')

 while True:
     data = f.readline()