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 如何连续读取一个由服务器发来的非阻塞请求?相关推荐

  1. python获取url返回值_python获取url的返回信息方法

    如下所示: #!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys import urllib import urllib ...

  2. python获取url列表参数_python 获取url中的参数列表实例

    Python的urlparse有对url的解析,从而获得url中的参数列表 import urlparse urldata = "http://en.wikipedia.org/w/api. ...

  3. python处理表格数据教程_python利用Excel读取和存储测试数据完成接口自动化教程...

    http_request2.py用于发起http请求 #读取多条测试用例 #1.导入requests模块 import requests #从 class_12_19.do_excel1导入read_ ...

  4. python自动生成鸡汤文_python爬虫+pyinstaller制作一个属于自己的心灵鸡汤

    效果图如下: 实现方法 用Python爬虫对现有的api进行请求,获取彩虹屁,然后用tkinter模块形成一个可视化的gui,最后用pyinstaller对该py文件打包,这就是最后的彩虹屁生成器. ...

  5. python访问局域网共享文件夹_Python+flask 实现的局域网文件共享服务器

    一直没有用python 做过web开发,以前看python的教程的时候,都会跳过这个环节,最近没事的时候,看来一下,感觉还挺方便的.就一边算是学习,一边算是练习,写了一个python实现的局域网文件共 ...

  6. python写服务器端qt客户端_python写一些简单的tcp服务器和客户端

    代码贴上,做个记录 TcpClient # -*- coding:utf-8 -*- import socket target_host = "127.0.0.1" #服务器端地址 ...

  7. python拆分excel并发送邮件_python使用tkinterpandassmtplib读取Excel并发送邮件

    1. 功能介绍: 当然是因为15号发工资啦,每次都是等呀等呀等呀等呀,最后终于等到一张来自Excel的工资条截图 于是我就希望能够学以致用试试,但是写好了又不敢给领导看~哈哈哈,发给大家批评批评 首先 ...

  8. python打开浏览器怎么写_python实现随机调用一个浏览器打开网页

    前两天总结了一下python爬虫 使用真实浏览器打开网页的两种方法总结 但那仅仅是总结一下而已,今天本文来实战演练一下 依然使用的是 webbrowser 这个模块 来调用浏览器 关于的三种打开方式在 ...

  9. python爬虫requests简单案例_Python小例子:一个最简单的爬虫

    学习编程的过程中总是有些枯燥.成天面对黑乎乎的窗口可能真的有些无聊.来,我们做点好玩的事情吧.比如 将网络上你喜欢的图片保存下来.不过千里之行 始于足下,在学习将网页上的图片下载下来之前.我们首先要学 ...

  10. python装饰器 廖雪峰_python装饰器的一个妙用

    好吧,我知道是大半夜--,但我还是觉得赶紧花上半个小时,把这最新的想法分享出来是值得的~直接进入正题~ 我们来模拟一个场景,需要你去抓去一个页面,然后这个页面有好多url也要分别去抓取,而进入这些子u ...

最新文章

  1. LVS Nginx HAProxy 优缺点
  2. ASP.NET MVC过滤器(一)
  3. Android点击事件(click button)的四种写法
  4. 【AWSL】之Linux系统安全及应用(su、PAM、sudo、GRUB、JR、NMAP)
  5. velocity 的 escape实现
  6. 老刘说NLP:焦虑被大肆贩卖下的自然语言处理学习思考
  7. DDL 操作表 删除
  8. struts2 配置
  9. katalon studio基础使用教程
  10. FATAL :210330:1710: 3.0 SOLVE/read_biases: Zero WL biases read from N-file
  11. 国内主流的大数据平台厂商有哪些?
  12. 第一篇博客--有志者,事竟成
  13. raid读写速度对比_组建RAID 0前后的读写速度对比
  14. FlyoutMenus
  15. java html读取数据库数据类型,从Word(Docx)读取方程式和公式到html并使用java保存数据库(示例代码)...
  16. 马化腾,直接把360做特了!
  17. 微信小程序全局数据共享学习笔记
  18. 第十七届“振兴杯”全国青年 职业技能大赛——计算机程序设计员(云计算平台与运维)参赛回顾与总结
  19. 1.Linux中超频及cpufreq相关汇总
  20. ami免刷bios 开启bios设置

热门文章

  1. 黑马程序员 Python学习笔记之PyCharm 的初始设置
  2. tinyxml读xml
  3. Atitit 数据库 负载均衡 方法总结 目录 1. 对称模型负载均衡 vs 非对称模型 2 1.1. 业务分离法 2 1.2. App + db分布式分离法 2 2. 负载均衡算法 2 2.1.
  4. Atitit 读取音频音乐文件的bpm 目录 1.1. Librosa是一个用于音频、音乐分析、处理的python工具包, 1 1.2. \bpm.py 1 1.3. Echo 2 1.4. Cod
  5. Atitit 教育学体系 教育学主要内容多语言,教学论,心理学,体育 高等教育学 职业技术教育学 教育史
  6. Atitit.java eval功能的实现  Compiler API
  7. Atitit.研发团队与公司绩效管理的原理概论的attilax总结
  8. paip.c++ bcb string 转换操作大总结.
  9. 【交易技术前沿】浅析基金业推进数据治理的阻碍及应对建议
  10. 美的董事长:数字化每年投几十亿,看不见结果我也焦虑