异步非阻塞模块原理

# 基于socket实现http请求
import socket
# 多路IO复用模块
import select socket_list= []
url_list = ["http://www.baidu.com", ...]
for url in url_list:
sk = socket.socket()
# 设置非阻塞模式
sk.setblocking(False)
try:
sk.connect((url, 80))
except BlockingIOError as e:
print(e)
# 为每个url请求都创建一个socket对象并把它放到一个列表里
socket_list.append(sk) # 事件循环
# tornado/twisted事件循环的原理就是通过这种方式来实现的
while True:
# 监测socket是否连接成功了
# 监测socket是否可以进行接受数据了
r, w, e = select.select(socket_list, socket_list, [], 0.05)
for obj in w:
obj.send("GET / HTTP1.1\r\nhost:...")
for obj in r:
response = obj.recv(4096)
print(response)

自定制一个基于socket实现的异步非阻塞模块

import socket
import select
import uuid # 定义一个Request类 对socket对象进行二次封装
class Request(object):
def __init__(self, sock, info):
self.sock = sock
self.info = info def fileno(self):
return self.sock.fileno() class Lou(object): def __init__(self):
self.sock_list = []
self.conn_list = [] def add_request(self, req_info):
sk = socket.socket()
sk.setblocking(False)
try:
sk.connect((req_info['host'], req_info['port']))
except BlockingIOError as e:
pass
obj = Request(sk, req_info)
self.conn_list.append(obj)
self.sock_list.append(obj) def run(self):
while True:
# 只要列表中的对象有fileno方法就可以作为select的参数
r, w, e = select.select(self.sock_list, self.conn_list, [], 0.05)
for obj in w:
data = "GET %s HTTP/1.1\r\nhost:%s\r\n\r\n" % (obj.info["path"], obj.info["host"])
obj.sock.send(data.encode("utf-8"))
self.conn_list.remove(obj)
for obj in r:
response = obj.sock.recv(8192)
print(obj.info["host"], response)
self.sock_list.remove(obj)
obj.info["callback"](response)
if not self.sock_list:
break def done(response):
filename = uuid.uuid4()
with open("%s.html"%filename, "wb") as f:
f.write(response) url_list = [
{"host": "www.baidu.com", "port": 80, "path": "/", "callback": done},
{"host": "www.cnblogs.com", "port": 80, "path": "/", "callback": done},
{"host": "www.bing.com", "port": 80, "path": "/", "callback": done},
] l = Lou()
for req_info in url_list:
l.add_request(req_info) l.run()

基于socket实现http请求的更多相关文章

  1. 一个基于Socket的http请求监听程序实现

    首先来看以下我们的需求: 用java编写一个监听程序,监听指定的端口,通过浏览器如http://localhost:7777来访问时,可以把请求到的内容记录下来,记录可以存文件,sqlit,mysql ...

  2. 【PHPsocket编程专题(实战篇③)】构建基于socket的HTTP请求类

    该代码是两年前写的,现在看起来有点渣了,仅仅是提供一个思路,现在做一些Api开发的时候官方会有一些SDK,这些SDK其实原理都是通过socket来通讯的,其实我个人主张用curl更方便,当然前提是你的 ...

  3. IO多路复用丶基于IO多路复用+socket实现并发请求丶协程

    一丶IO多路复用 IO多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作 IO多路复用作用: 检测多个socket是否已经发生变 ...

  4. 基于socket.io的实时在线选座系统

    基于socket.io的实时在线选座系统(demo) 前言 前段时间公司做一个关于剧院的项目,遇到了这样一种情况. 在高并发多用户同时选座的情况下,假设A用户进入选座页面,正在选择座位,此时还没有提交 ...

  5. C#中级-从零打造基于Socket在线升级模块

    一.前言       前段时间一直在折腾基于Socket的产品在线升级模块.之前我曾写过基于.Net Remoting的.基于WCF的在线升级功能,由于并发量较小及当时代码经验的不足一直没有实际应用. ...

  6. 基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)

    今天我们来盘一盘Socket通讯和WebSocket协议在即时通讯的小应用——聊天. 理论大家估计都知道得差不多了,小编也通过查阅各种资料对理论知识进行了充电,发现好多demo似懂非懂,拷贝回来又运行 ...

  7. 基于Socket网络编程

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a2011480169/article/details/73602708 博客核心内容: 1.Sock ...

  8. socket 模拟 HTTP请求

    一.socket介绍 网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层.socket则是对TCP/I ...

  9. 【Socket】从零打造基于Socket在线升级模块

    一.前言       前段时间一直在折腾基于Socket的产品在线升级模块.之前我曾写过基于.Net Remoting的.基于WCF的在线升级功能,由于并发量较小及当时代码经验的不足一直没有实际应用. ...

随机推荐

  1. STL库学习笔记(待补充QAQ

    几百年前就说要学STL了然后现在还没动呢QAQ总算还是克服了懒癌决定学下QAQ 首先港下有哪几个vector listset map stack queue,大概就这些? 然后因为有几个基本操作每个都 ...

  2. asp.net mvc easyui tree

    1.html页面代码: <div class="easyui-panel" style="padding:5px" id="powerTree& ...

  3. android 知识汇总

    1.assets:不会在R.java文件下生成相应的标记,assets文件夹可以自己创建文件夹,必须使用AssetsManager类进行访问,存放到这里的资源在运行打包的时候都会打入程序安装包中, 2 ...

  4. OCP-第三节课.md

    一. dataguard  stream  字节流技术: 二. 突然断电:触发实例恢复过程: 三. 宕机:赔钱 四. Redis.MQ(消息中间件.队列管理器.缓存)(内存数据库) 五. IBM MQ ...

  5. qrcode插件生成二维码

    <!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...

  6. sublime lincense for linux

    sublime lincense for linux Sublime Text 3.x (after Build 3133) —– BEGIN LICENSE —–TwitterInc200 User ...

  7. oracle数据库调整字段顺序

    oracle数据库调整字段顺序 https://blog.csdn.net/xiaobaixie/article/details/77892034

  8. 怎么让table中的<td>内容向上对齐

    <td valign="top"></td>

  9. springmvc学习路线1-基本配置

    1.第一个springmvc实例helloword 关键点拨 1.1 web.xml文件的配置 <servlet> <servlet-name>springMVC</se ...

  10. Codeforces 955F Heaps - 动态规划

    题目传送门 传送点I 传送点II 传送点III 题目大意 给定一棵以1为根的树,定义$dp_{k}(u)$表示在$u$的子树内存在的深度最大的满k叉树的深度,求$\sum_{u = 1}^{n}\su ...