python请求url非阻塞_python 如何连续读取一个由服务器发来的非阻塞请求?
lianghui
2014-11-22 21:37:03 +08:00
如果是tornado4, 可以用chunked transfer enoding传送,那么客户端支持chunk编码就可以做数据接收了。http://en.wikipedia.org/wiki/Chunked_transfer_encoding。
tornado3不支持chunk:
import tornado.ioloop
import tornado.iostream
import socket
```python
class WebRequest(object):
LINE_END = b'\r\n'
def __init__(self, host, port=80, callback=None):
self.host = host
self.port =port
self.headers = {}
self.data = ''
self.callback = callback
self.transfer = 'stream'
self.http_ver_with_status = ''
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
self.stream = tornado.iostream.IOStream(s)
self.stream.connect((self.host, self.port), self.send_request)
def send_request(self):
self.stream.write(b"GET / HTTP/1.0\r\nHost: %s\r\n\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36\r\n" %self.host)
self.stream.read_until(self.LINE_END*2, self.on_headers)
def on_headers(self, data):
for line in data.split(self.LINE_END):
parts = line.split(b":", 1)
if len(parts) == 2:
self.headers[parts[0].strip()] = parts[1].strip()
else:
self.http_ver_with_status = line
if 'Content-Length' in self.headers:
if int(self.headers[b"Content-Length"]) > 0:
print self.headers
print 'content_length: ', self.headers[b"Content-Length"]
self.transfer = 'content_length'
self.stream.read_bytes(int(self.headers[b"Content-Length"]), self.on_body)
else:
self.callback(self)
self.stream.close()
elif self.headers.get(b'Transfer-Encoding') == 'chunked':
print 'chunk'
self.transfer = 'chunked'
self.on_chunk()
else:
self.transfer = 'stream'
callback = lambda data: self.on_stream(data, True)
streaming_callback = lambda data: self.on_stream(data, False)
self.stream.read_until_close(callback, streaming_callback)
def on_body(self, data):
self.data += data
self.callback(self)
self.stream.close()
def on_chunk(self):
self.stream.read_until_regex(self.LINE_END, self.on_chunk_header)
def on_chunk_header(self, data):
length = int(data)
if length > 0:
self.stream.read_bytes(length+len(self.LINE_END), self.on_chunk_data)
else:
self.stream.read_bytes(length+len(self.LINE_END), self.on_chunk_end)
def on_chunk_end(self, data):
self.callback(self)
self.stream.close()
def on_chunk_data(self, data):
print data
self.data += data
self.on_chunk()
def on_stream(self, data, finish=False):
# do some thing
if finish:
self.data += data
self.callback(self)
self.stream.close()
else:
self.data += data
def callback(req):
print req.http_ver_with_status
print "Transfer :" , req.transfer
print "Headers: ", req.headers
print "Data: ", req.data
req = WebRequest('cn.bing.com', 80, on_bing)
def on_bing(req):
print req.http_ver_with_status
print "Transfer :" , req.transfer
print "Headers: ", req.headers
print "Data: ", req.data
tornado.ioloop.IOLoop.instance().stop()
if __name__ == '__main__':
req = WebRequest('www.baidu.com', 80, callback)
tornado.ioloop.IOLoop.instance().start()
```
python请求url非阻塞_python 如何连续读取一个由服务器发来的非阻塞请求?相关推荐
- python获取url返回值_python获取url的返回信息方法
如下所示: #!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys import urllib import urllib ...
- python获取url列表参数_python 获取url中的参数列表实例
Python的urlparse有对url的解析,从而获得url中的参数列表 import urlparse urldata = "http://en.wikipedia.org/w/api. ...
- python处理表格数据教程_python利用Excel读取和存储测试数据完成接口自动化教程...
http_request2.py用于发起http请求 #读取多条测试用例 #1.导入requests模块 import requests #从 class_12_19.do_excel1导入read_ ...
- python自动生成鸡汤文_python爬虫+pyinstaller制作一个属于自己的心灵鸡汤
效果图如下: 实现方法 用Python爬虫对现有的api进行请求,获取彩虹屁,然后用tkinter模块形成一个可视化的gui,最后用pyinstaller对该py文件打包,这就是最后的彩虹屁生成器. ...
- python访问局域网共享文件夹_Python+flask 实现的局域网文件共享服务器
一直没有用python 做过web开发,以前看python的教程的时候,都会跳过这个环节,最近没事的时候,看来一下,感觉还挺方便的.就一边算是学习,一边算是练习,写了一个python实现的局域网文件共 ...
- python写服务器端qt客户端_python写一些简单的tcp服务器和客户端
代码贴上,做个记录 TcpClient # -*- coding:utf-8 -*- import socket target_host = "127.0.0.1" #服务器端地址 ...
- python拆分excel并发送邮件_python使用tkinterpandassmtplib读取Excel并发送邮件
1. 功能介绍: 当然是因为15号发工资啦,每次都是等呀等呀等呀等呀,最后终于等到一张来自Excel的工资条截图 于是我就希望能够学以致用试试,但是写好了又不敢给领导看~哈哈哈,发给大家批评批评 首先 ...
- python打开浏览器怎么写_python实现随机调用一个浏览器打开网页
前两天总结了一下python爬虫 使用真实浏览器打开网页的两种方法总结 但那仅仅是总结一下而已,今天本文来实战演练一下 依然使用的是 webbrowser 这个模块 来调用浏览器 关于的三种打开方式在 ...
- python爬虫requests简单案例_Python小例子:一个最简单的爬虫
学习编程的过程中总是有些枯燥.成天面对黑乎乎的窗口可能真的有些无聊.来,我们做点好玩的事情吧.比如 将网络上你喜欢的图片保存下来.不过千里之行 始于足下,在学习将网页上的图片下载下来之前.我们首先要学 ...
- python装饰器 廖雪峰_python装饰器的一个妙用
好吧,我知道是大半夜--,但我还是觉得赶紧花上半个小时,把这最新的想法分享出来是值得的~直接进入正题~ 我们来模拟一个场景,需要你去抓去一个页面,然后这个页面有好多url也要分别去抓取,而进入这些子u ...
最新文章
- LVS Nginx HAProxy 优缺点
- ASP.NET MVC过滤器(一)
- Android点击事件(click button)的四种写法
- 【AWSL】之Linux系统安全及应用(su、PAM、sudo、GRUB、JR、NMAP)
- velocity 的 escape实现
- 老刘说NLP:焦虑被大肆贩卖下的自然语言处理学习思考
- DDL 操作表 删除
- struts2 配置
- katalon studio基础使用教程
- FATAL :210330:1710: 3.0 SOLVE/read_biases: Zero WL biases read from N-file
- 国内主流的大数据平台厂商有哪些?
- 第一篇博客--有志者,事竟成
- raid读写速度对比_组建RAID 0前后的读写速度对比
- FlyoutMenus
- java html读取数据库数据类型,从Word(Docx)读取方程式和公式到html并使用java保存数据库(示例代码)...
- 马化腾,直接把360做特了!
- 微信小程序全局数据共享学习笔记
- 第十七届“振兴杯”全国青年 职业技能大赛——计算机程序设计员(云计算平台与运维)参赛回顾与总结
- 1.Linux中超频及cpufreq相关汇总
- ami免刷bios 开启bios设置
热门文章
- 黑马程序员 Python学习笔记之PyCharm 的初始设置
- tinyxml读xml
- Atitit 数据库 负载均衡 方法总结 目录 1. 对称模型负载均衡 vs 非对称模型	2 1.1. 业务分离法	2 1.2. App + db分布式分离法	2 2. 负载均衡算法	2 2.1.
- Atitit 读取音频音乐文件的bpm 目录 1.1. Librosa是一个用于音频、音乐分析、处理的python工具包,	1 1.2. \bpm.py	1 1.3. Echo	2 1.4. Cod
- Atitit 教育学体系 教育学主要内容多语言,教学论,心理学,体育 高等教育学 职业技术教育学 教育史
- Atitit.java eval功能的实现 Compiler API
- Atitit.研发团队与公司绩效管理的原理概论的attilax总结
- paip.c++ bcb string 转换操作大总结.
- 【交易技术前沿】浅析基金业推进数据治理的阻碍及应对建议
- 美的董事长:数字化每年投几十亿,看不见结果我也焦虑