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

Posted

技术标签:

【中文标题】使用 Python 读取 HTTP 服务器推送流【英文标题】:Reading HTTP server push streams with Python 【发布时间】:2010-04-26 20:53:14 【问题描述】:

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

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

有没有办法让流保持打开状态,以便在每个程序循环中检查新内容,而不是每隔几秒钟等待整个内容重新下载,从而引入延迟?

【问题讨论】:

【参考方案1】:

你可以试试requests 库。

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】:

您是否需要实际解析响应标头,或者您主要对内容感兴趣?您的 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()

【讨论】:

这有点用(一旦我得到了一个 POST 请求的标题,无论如何)。然而,几秒钟后,连接似乎终止了,我从服务器得到一个“【参考方案3】:

使用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()

【讨论】:

这似乎不起作用。我放弃了身份验证的东西,因为我不需要它,只使用了一个 HTTPHandler。还在循环中添加了一个 sleep() 以阻止它消耗过多的 CPU,并在遇到任何数据时打印到屏幕。它运行脚本启动时存在的流内容,然后不再获取任何数据。

以上是关于使用 Python 读取 HTTP 服务器推送流的主要内容,如果未能解决你的问题,请参考以下文章

如何从 net/http 请求中读取 HTTP/2 推送帧

Jetty HTTP2 服务器推送支持

Grpc Streaming 你造?

使用 PHP 从 Apple 增强推送通知中读取错误

使用 Python over Apache 通过 HTTP 向用户推送文件时文件名错误

Gmail推送通知Python API