Python网络编程(http协议,IO多路复用、select内核监听)
前言:
补充昨天HTTP:
from socket import *
# 接收请求
# 查看请求
# 返回客户端段请求内容 def handleClient(connfd):
request = connfd.recv(4096)
# print("***********")
# print(request)
# print("************")
# 按照行切割请求
request_lines = request.splitlines()
for line in request_lines:
print(line.decode()) try:
f = open('index.html')
except IOError:
response = "HTTP/1.1 303 Not Found\r\n"
response += "\r\n" # 空行
response += '''
**************************
Sorry, not found the page.
**************************
'''
else:
response = "HTTP/1.1 200 OK\r\n"
response += '\r\n'
response += f.read()
finally:
# 发送给浏览器
connfd.send(response.encode()) # 创建套接字,调用handleClient完成功能
def main():
# 创建tcp套接字
sockfd = socket()
sockfd.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
sockfd.bind(('0.0.0.0', 8000))
sockfd.listen()
while True:
print("Listen the port 8000...")
connfd, addr = sockfd.accept()
# 处理浏览器发来的请求
handleClient(connfd)
connfd.close() if __name__ == "__main__":
main()
from socket import *
from select import * s = socket()
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind(('0.0.0.0',8888))
s.listen(5) #创建poll对象
p = poll() #创建地图
fdmap = {s.fileno():s} #添加关注
p.register(s,POLLIN | POLLERR) while True:
#进行IO监控
#[(fileno,evnet),...]
events = p.poll()
for fd,event in events:
if fd == s.fileno():
#从地图中找到fd对应的对象
c,addr = fdmap[fd].accept()
print("Connect from",addr)
#注册新的IO 维护地图
p.register(c,POLLIN)
fdmap[c.fileno()] = c
else:
data = fdmap[fd].recv(1024)
if not data:
p.unregister(fd) #从关注移除
fdmap[fd].close()
del fdmap[fd] #从地图删除
else:
print(data.decode())
fdmap[fd].send('收到了'.encode())
from socket import *
from select import select
# 创建套接字
s = socket()
# 设置端口重用
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 绑定地址
s.bind(('0.0.0.0', 8888))
# 设置队列
s.listen(5)
# 注册监听套接字
rlist = [s]
wlist = []
xlist = [s] while True:
print("等待IO发生")
rs, ws, xs = select(rlist, wlist, xlist)
# 循环遍历rs准备就绪列表
for r in rs:
# 如果有新的客户端链接请求
if r is s:
# 链接客户端并返回客户端套接字
connfd, addr = r.accept() # r==s 原套接字
print("Connect from", addr)
# 将绑定客户端套接字加入监听列表
rlist.append(connfd)
# 表示客户端连接套接字准备就绪
else:
# 如果是客户端套接字发送数据 则接收
data = r.recv(1024)
if not data: # 如果客户端断开链接
# 从关注列表移除connfd
rlist.remove(r)
r.close() # 关闭套接字
else:
print("Receive:", data.decode())
# 讲客户端套接字放入wlist
wlist.append(r)
# wlist列表会直接返回
# 循环遍历ws准备就绪列表
for w in ws:
# 消息回复
w.send("这是一条回复消息".encode())
# 删除并取消监听已处理消息
wlist.remove(w)
# xs列表:待处理异常
for x in xs:
if x is s:
s.close()

from socket import * # 创建套接字
sockfd = socket() # 发起连接
sockfd.connect(('127.0.0.1', 8888)) while True:
# 消息收发
msg = input("Msg>>")
if not msg:
break
sockfd.sendall(msg.encode())
data = sockfd.recv(1024)
print(data.decode()) sockfd.close()
# myserver.py
# 应用 :
# select服务端,同时关注客户端连接
# 客户端发送和终端输入。将客户端发送和终端输入的内容全都写入到一个文件中 from socket import *
from select import *
from sys import stdin sock = socket()
sock.getsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
sock.bind(("127.0.0.1", 6666))
sock.listen(5)
rlist = [sock, stdin]
wlist = []
xlist = []
file = open("selectdemo.txt", "w+b")
while True:
rs, ws, xs, = select(rlist, wlist, xlist)
for r in rs:
if r == sock:
connfd, addr = r.accept()
print("已连接......")
rlist.append(connfd)
elif r == stdin:
data = stdin.readline()
file.write(data.encode())
file.flush()
else:
data = r.recv(4096)
if not data:
rlist.remove(r)
r.close()
else:
file.write(data + "\n".encode())
file.flush()
print("已经接收内容并写如select>>>.txt文件内\n 内容:", data.decode())
r.send("接收成功!".encode())
file.close()
from socket import * # 创建套接字
sockfd = socket() # 发起连接
sockfd.connect(('127.0.0.1', 6666)) while True:
# 消息收发
msg = input("Msg>>")
if not msg:
break
sockfd.sendall(msg.encode())
data = sockfd.recv(1024)
print(data.decode()) sockfd.close()

Python网络编程(http协议,IO多路复用、select内核监听)的更多相关文章
- 网络编程socket 结合IO多路复用select; epool机制分别实现单线程并发TCP服务器
select版-TCP服务器 1. select 原理 在多路复用的模型中,比较常用的有select模型和epoll模型.这两个都是系统接口,由操作系统提供.当然,Python的select模块进行了 ...
- python 网络编程 -- Tcp协议
Socket是网络编程的一个抽象概念.通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 客户端 大多数连接都是可靠 ...
- python网络编程-TCP协议中的三次握手和四次挥手(图解)
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...
- Python网络编程:IO多路复用
io多路复用:可以监听多个文件描述符(socket对象)(文件句柄),一旦文件句柄出现变化,即可感知. sk1 = socket.socket() sk1.bind(('127.0.0.1',8001 ...
- python网络编程——SocketServer/Twisted/paramiko模块
在之前博客C/S架构的网络编程中,IO多路复用是将多个IO操作复用到1个服务端进程中进行处理,即无论有多少个客户端进行连接请求,服务端始终只有1个进程对客户端进行响应,这样的好处是节省了系统开销(se ...
- 第五十五节,IO多路复用select模块加socket模块,伪多线并发
IO多路复用select模块加socket模块,伪多线并发,并不是真正的多线程并发,实际通过循环等待还是一个一个处理的 IO多路复用,lo就是文件或数据的输入输出,IO多路复用就是可以多用户操作 IO ...
- python网络编程——IO多路复用之select
1 IO多路复用的概念 原生socket客户端在与服务端建立连接时,即服务端调用accept方法时是阻塞的,同时服务端和客户端在收发数据(调用recv.send.sendall)时也是阻塞的.原生so ...
- python 网络编程 IO多路复用之epoll
python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解 此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...
- Python实战之IO多路复用select的详细简单练习
IO多路复用 I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. select 它通过一个select()系统调用来 ...
随机推荐
- Python 爬虫的工具列表
这个列表包含与网页抓取和数据处理的Python库 网络 通用 urllib -网络库(stdlib). requests -网络库. grab - 网络库(基于pycurl). pycurl - 网络 ...
- C语言中volatile关键字的作用[转]
一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没 ...
- 3、SpringBoot------邮件发送(1)
开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/Springboot/tree/8878e8e89ce01ceb967ef8c1193ac740a6 ...
- Subversion简介
作为一名编程人员,SVN经常作为代码.项目的版本控制,殊不知SVN也可作为其他领域的版本控制,例如对文档.音频.视频等 . SVN可以看成一种文件系统,为了使工作人员提高工作效率,可以进行并行的工作, ...
- java通过FreeMarker模板生成Excel文件之.ftl模板制作
关于怎么通过freemarker模板生成excel的文章很多,关键点在于怎么制作模板文件.ftl 网上的办法是: (1)把Excel模板的格式调好,另存为xml文件 (2)新建一个.ftl文件,把xm ...
- Linux下常用压缩 解压命令与压缩比率对比
常用的格式有:tar, tar.gz(tgz), tar.bz2, 不同方式,压缩和解压方式所耗CPU时间和压缩比率也差异也比较大. 1. tar只是打包动作,相当于归档处理,不做压缩:解压也一样,只 ...
- [异常笔记] spring boot 启动-2018040201
异常 1.编码引发异常 00:59:49.311 [main] DEBUG org.springframework.boot.devtools.settings.DevToolsSettings - ...
- dom技术解析xml下jaxp解析器详细代码
1.使用jaxp实现查询操作 person.xml <?xml version="1.0" encoding="UTF-8" standalone=&qu ...
- Python系列6之面向对象
目录 生成器和迭代器 字符串格式化 内置函数vars 反射 面向对象编程 一. 生成器和迭代器 1. 生成器 生成器具有一种生成的能力,它仅仅代表着一种生成的能力,当我们需要使用的时候,才会通过迭代 ...
- c++右值引用
右值 右值是相对与左值来说的. 左值是以变量的形式存在,指向一个指定的内存,可以对它取地址.右值就是不指向任何地方,它是暂时和短命的,不能对它取地址. 右值引用 把临时的.生命周期短的值,绑定到一个变 ...