基于socket实现http请求
异步非阻塞模块原理
# 基于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请求的更多相关文章
- 一个基于Socket的http请求监听程序实现
首先来看以下我们的需求: 用java编写一个监听程序,监听指定的端口,通过浏览器如http://localhost:7777来访问时,可以把请求到的内容记录下来,记录可以存文件,sqlit,mysql ...
- 【PHPsocket编程专题(实战篇③)】构建基于socket的HTTP请求类
该代码是两年前写的,现在看起来有点渣了,仅仅是提供一个思路,现在做一些Api开发的时候官方会有一些SDK,这些SDK其实原理都是通过socket来通讯的,其实我个人主张用curl更方便,当然前提是你的 ...
- IO多路复用丶基于IO多路复用+socket实现并发请求丶协程
一丶IO多路复用 IO多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作 IO多路复用作用: 检测多个socket是否已经发生变 ...
- 基于socket.io的实时在线选座系统
基于socket.io的实时在线选座系统(demo) 前言 前段时间公司做一个关于剧院的项目,遇到了这样一种情况. 在高并发多用户同时选座的情况下,假设A用户进入选座页面,正在选择座位,此时还没有提交 ...
- C#中级-从零打造基于Socket在线升级模块
一.前言 前段时间一直在折腾基于Socket的产品在线升级模块.之前我曾写过基于.Net Remoting的.基于WCF的在线升级功能,由于并发量较小及当时代码经验的不足一直没有实际应用. ...
- 基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
今天我们来盘一盘Socket通讯和WebSocket协议在即时通讯的小应用——聊天. 理论大家估计都知道得差不多了,小编也通过查阅各种资料对理论知识进行了充电,发现好多demo似懂非懂,拷贝回来又运行 ...
- 基于Socket网络编程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a2011480169/article/details/73602708 博客核心内容: 1.Sock ...
- socket 模拟 HTTP请求
一.socket介绍 网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层.socket则是对TCP/I ...
- 【Socket】从零打造基于Socket在线升级模块
一.前言 前段时间一直在折腾基于Socket的产品在线升级模块.之前我曾写过基于.Net Remoting的.基于WCF的在线升级功能,由于并发量较小及当时代码经验的不足一直没有实际应用. ...
随机推荐
- selenium操作浏览器
import org.openqa.selenium.WebDriver; import common.StartFireFox; public class TestBrowser { public ...
- python使用MySQLdb实现连接数据库Mysql
python实现连接数据库mysql的步骤: 一.引入MySQLdb 二.获取与数据库的连接 三.执行SQL语句和存储过程 四.关闭数据库连接 1.什么是MySQLdb? MySQLdb是用于pyth ...
- Python实现链表
1.1实现单向链表 #链表结构分成2部分 head,tail #('a',('b',('c',none))) #迭代时候 Head is a ;;;; tail is ('b',('c',none)) ...
- tensorflow输出
在Session对象上调用run()函数,执行流图,即可得到输出, 可获取单个输出,也可获取多个输出 import tensorflow as tf import numpy as np consta ...
- PowerShell 语法备忘
1.挡可能出现 .0 的时候需要加上引号 2.使用 -Join 或者 + 进行字符串拼接 3.在cmd 命令下可以使用 set /a s=1+2 表示需要进行计算,而不是拼接
- IE缓存清除
原文转载自:http://blog.csdn.net/whatday/article/details/7566925 首先: 在 stdafx.h中要加入: #include "atlba ...
- Vue基础进阶 之 过渡效果
进入/离开过渡效果:Vue在插入.更新或移除DOM时,可以设置一些动画效果: 如何使用过渡效果:利用<transition></transition>组件将需要应用的过渡效果的 ...
- UI自动化(四)css样式
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- koa2 中 cookie 存在的中文问题
koa2 中的 cookie 没办法直接设置中文,会报错 ‘ argument value is invalid ’ 解决办法: 先将它转成 ‘ base64 ’ 编码来存储 new Buffer( ...
- DDD 之 Multiple Canonical Models
MultipleCanonicalModels Scratch any large enterprise and you'll usually find some kind of group focu ...