python之路之io多路复用
1、实现io多路复用利用select
s1同时接受三个客户端(开启了三个服务器端口)
#!/usr/bin/env python
# -*- coding: utf-8 -*- import socket
import select sk = socket.socket()
sk.bind(('127.0.0.2', 9001))
sk.listen() sk1 = socket.socket()
sk1.bind(('127.0.0.2', 9002))
sk1.listen() sk2 = socket.socket()
sk2.bind(('127.0.0.2', 9003))
sk2.listen() inputs = [sk, sk1, sk2]
while True: # [sk, sk1, sk2]select 内部自动监听sk1,sk,sk2三个对象,一旦某个句柄 # 如果有人连接sk1,sk2
# r_list = [sk1,sk2]
r_list, w_list, e_list = select.select(inputs, [], [], 1)
# 1,是等待1秒的意思
for sk in r_list:
conn, address = sk.accept()
conn.sendall(bytes('hello', encoding='utf-8'))
conn.close()
for sk in e_list:
inputs.remove(sk
s1
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket obj = socket.socket()
obj.connect(('127.0.0.2', 9001)) content = str(obj.recv(1024), encoding='utf-8')
print(content) obj.close()
c1
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket obj = socket.socket()
obj.connect(('127.0.0.2', 9002)) content = str(obj.recv(1024), encoding='utf-8')
print(content) obj.close()
c2
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket obj = socket.socket()
obj.connect(('127.0.0.2', 9003)) content = str(obj.recv(1024), encoding='utf-8')
print(content) obj.close()
c3
2、实现io多路的复用利用select
s1中只有一个服务器端口,底层用select,类似与,同时接三个电话,开免提,谁说话回答谁
#!/usr/bin/env python
# -*- coding: utf-8 -*- import socket
import select sk1 = socket.socket()
sk1.bind(('127.0.0.2', 9000))
sk1.listen() inputs = [sk1]
while True: # r_list 中一开始只有服务器sk1,小军连接时,会把小军加入到inputs r_list, w_list, e_list = select.select(inputs, [], inputs, 1)
# 1,是等待1秒的意思
print('正在监听的socket对象%d' % len(inputs))
print(r_list)
for sk1_or_conn in r_list:
# 每一个连接对象
if sk1_or_conn == sk1:
conn, address = sk1_or_conn.accept()
inputs.append(conn)
else:
try: # 有老用户发消息了
data_bytes = sk1_or_conn.recv(1024)
data_str = str(data_bytes,encoding='utf-8')
sk1_or_conn.sendall(bytes(data_str+'好', encoding='utf-8'))
except Exception as ex:
inputs.remove(sk1_or_conn)
server
# 只需重复运行三次即可
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket obj = socket.socket()
obj.connect(('127.0.0.2', 9000)) while True:
inp = input('>>>>')
obj.sendall(bytes(inp, encoding='utf-8'))
ret = str(obj.recv(1024), encoding='utf-8')
print(ret) obj.close()
c3(当三个客户端)
3、io多路复用socketserver
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socketserver class MyServer(socketserver.BaseRequestHandler):
def handle(self):
conn = self.request # request 不要加括号,加括号显示不出来东西,
conn.sendall(bytes('欢迎来到梦幻西游', encoding='utf-8'))
while True:
ret_bytes = conn.recv(1024)
ret_str = str(ret_bytes, encoding='utf-8')
if ret_str == 'q':
break
conn.sendall(bytes(ret_str + "好", encoding='utf-8')) if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.2', 1324), MyServer)
server.serve_forever()
socketserver
#!/usr/bin/env python
# -*- coding: utf-8 -*- import socket obj = socket.socket()
obj.connect(('127.0.0.2', 1324)) # 阻塞
re_bytes = obj.recv(1024)
ret_str = str(re_bytes, encoding='utf-8')
print(ret_str)
while True:
inp = input('请输入要发送的内容:')
if inp == 'q':
obj.sendall(bytes(inp, encoding='utf-8'))
break
else:
obj.sendall(bytes(inp, encoding='utf-8'))
ret = str(obj.recv(1024), encoding='utf-8') print(ret) obj.close()
client
4、io多路复用select
outputs的使用,inputs的使用
#!/usr/bin/env python
# -*- coding: utf-8 -*- import socket
import select sk1 = socket.socket()
sk1.bind(('127.0.0.2', 9000))
sk1.listen() inputs = [sk1]
outputs = []
message_dict = {} while True: # r_list 中一开始只有服务器sk1,小军连接时,会把小军加入到inputs r_list, w_list, e_list = select.select(inputs, outputs, inputs, 1)
# 1,是等待1秒的意思
print('正在监听的socket对象%d' % len(inputs))
print(r_list)
for sk1_or_conn in r_list:
# 每一个连接对象
if sk1_or_conn == sk1:
# 表示有新用户连接
conn, address = sk1_or_conn.accept()
inputs.append(conn)
message_dict[conn] = [] # 建立了一个字典{小军:[]}
else:
try: # 有老用户发消息了
data_bytes = sk1_or_conn.recv(1024)
except Exception as ex:
inputs.remove(sk1_or_conn)
else:
# 用户正常发消息
data_str = str(data_bytes, encoding='utf-8')
message_dict[sk1_or_conn].append(data_str) # {小军:1233}
outputs.append(sk1_or_conn) # [小军]
# 谁发消息就会在w_list中显示。
for conn in w_list:
recv_str = message_dict[conn][0]
del message_dict[conn][0]
conn.sendall(bytes(recv_str + '好', encoding='utf-8'))
outputs.remove(conn) for sk in e_list:
inputs.remove(sk)
s1
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket obj = socket.socket()
obj.connect(('127.0.0.2', 9000)) while True:
inp = input('>>>>')
obj.sendall(bytes(inp, encoding='utf-8'))
ret = str(obj.recv(1024), encoding='utf-8')
print(ret) obj.close()
c1
python之路之io多路复用的更多相关文章
- Python之路,Day9 , IO多路复用(番外篇)
同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. ...
- 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】
下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...
- Python网络编程:IO多路复用
io多路复用:可以监听多个文件描述符(socket对象)(文件句柄),一旦文件句柄出现变化,即可感知. sk1 = socket.socket() sk1.bind(('127.0.0.1',8001 ...
- Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程
1.使用select模拟socketserver伪并发处理客户端请求,代码如下: import socket import select sk = socket.socket() sk.bind((' ...
- python协程和IO多路复用
协程介绍 ...
- 以python理解Linux的IO多路复用,select、poll、epoll
题外话 之前在看Unix环境高级编程的时候,看完高级IO那一章,感觉自己萌萌哒,0.0 ,有点囫囵吞枣的感觉,之后翻了几篇博客,从纯系统的角度理解,稍微有了点概念,以这两篇为例,可以以后参考: htt ...
- python selectors模块实现 IO多路复用机制的上传下载
import selectorsimport socketimport os,time BASE_DIR = os.path.dirname(os.path.abspath(__file__))''' ...
- IO多路复用(转)
原文:Python之路,Day9 , IO多路复用(番外篇) 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文 ...
- 同步IO与一部IO、IO多路复用(番外篇)select、poll、epoll三者的区别;blocking和non-blocking的区别 synchronous IO和asynchronous IO的区别
Python之路,Day9 , IO多路复用(番外篇) 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. ...
随机推荐
- SQL server安装时显示重启计算机失败问题解决办法
前几天在装SQL server2016的时候,一直显示重启计算机失败; 网上的方法也找来用了,但是重启完还是同样的问题,试了很多种方法,最后在一次测试中点关机的时候不小心点成了重启(win10有个毛病 ...
- XMind快捷键汇总
在 XMind: ZEN 中,快捷键是可以大大提高绘图效率的存在.掌握常用的快捷键组合,就可以在键盘上运指如飞,快速地进行思维导图的绘制.还在等什么?感兴趣的朋友,下面就和小编一起来看看吧! XMin ...
- Docker学习笔记(2):使用Dockerfile构建镜像
Dockerfile是用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本.每条指令都必须为大写字母且后面要跟随至少一个参数,每条指令都会创建一个新的镜像层,并对镜像进行提交. Docker ...
- webpack打包后不能调用,改用uglifyjs打包压缩
背景: 项目基于原生js,没用到任何脚手架和框架,但也需要打包压缩. 项目的js中声明了一些全局变量 供其他js调用. 这时候如果用webpack打包,基于webpack特性,会嵌套一层大函数,会将j ...
- Ubuntu 打不开终端 侧边栏消失的解决办法
在网上找了很多办法,大多不行,具体原因也不太清楚,应该是Unity某些配置被改了. 我是在ubuntu14.04平台利用apt-get卸载python后,关机重启出现"打不开终端和侧边栏消失 ...
- 0002 PyCharm设置
1 设置编码格式 File/Settings/Editor/File Encodings 2 设置字体 File/Settings/Editor/Font 3 鼠标滚轮改变编辑器字体大小 File/S ...
- 记录 Docker 的学习过程 (安装基础篇)
docker 通过内核来实现 特点是效率高 1. centos7 三台(推荐2c 4g 最低 1c1g)2. 关闭防火墙 selinux3. 做好主机名解析,三台能互相ping通主机名host参考文件 ...
- uabntu命令行
1.命令行 命令行中令字体大小变大:ctrl+shift+"+" 命令行中令字体大小变小:ctrl+'-' 不执行:ctrl+c 下一页:f 上一页: ...
- Selenium3+python自动化013-操作浏览器的Cookie
为什么要用Cookie?在测试多个页面时候可绕过验证码输入,直接添加cookie,也可以在添加唯一标识时候使用. 一.操作浏览器的Cookie 1.1.验证码的处理方式 说明:WebDriver类库中 ...
- 题解 CF1064A 【Make a triangle!】
题目传送门 反正数学方法我是不会 那只能模拟了一只连模拟题解都看不懂的哀怨 我的思路大体如下 1.定义3个变量a,b,c并输入 int a,b,c; cin>>a>>b> ...