看到代码,我希望发生以下情况:
urlopen()
打开连接,并发送查询.然后服务器开始提供回复.此时,数据在缓冲区中累积,直到它们已满并且操作系统告诉服务器保持一段时间.
然后data.read()
清空缓冲区,以便操作系统告诉服务器继续,然后下载其余的回复.
当然,如果回复足够短,或者如果响应足够.read()
快,那么缓冲区没有时间填满,下载一次完成.
看到代码,我希望发生以下情况:
urlopen()
打开连接,并发送查询.然后服务器开始提供回复.此时,数据在缓冲区中累积,直到它们已满并且操作系统告诉服务器保持一段时间.
然后data.read()
清空缓冲区,以便操作系统告诉服务器继续,然后下载其余的回复.
当然,如果回复足够短,或者如果响应足够.read()
快,那么缓冲区没有时间填满,下载一次完成.
我同意ddaa.但是,如果您想了解这类事情,可以使用nc
(在*nix中)之类的东西设置虚拟服务器,然后在交互式Python解释器中打开URL.
在一个终端中,运行nc -l 1234
将打开套接字并侦听本地计算机的端口1234上的连接.nc
将接受传入连接并显示它从套接字读取的内容.您键入的任何内容都nc
将通过套接字发送到远程连接,在本例中为Python urlopen()
.
在另一个终端运行Python并输入您的代码,即
data = urllib2.urlopen('http://127.0.0.1:1234') data.read()
调用urlopen()
将建立与服务器的连接,发送请求然后阻止等待响应.您将看到nc
将HTTP请求打印到其终端中.
现在在正在运行的终端中输入内容nc
.调用urlopen()
仍然会阻止,直到你按下ENTER nc
,即直到它收到一个新的行字符.因此urlopen()
,在读取至少一个新行字符之前不会返回.(对于那些担心可能缓冲的人来说nc
,这不是一个问题.urlopen()
在它看到第一个新行字符之前会阻塞.)
因此应该注意,urlopen()
将阻塞直到接收到第一个新行字符,之后可以从连接读取数据.在实践中,HTTP响应是短多线响应,因此urlopen()
应该很快返回.