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分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. ...
随机推荐
- 第一个12PB的项目--2017年
今年第一个上PB级的项目终于落地.准备了几年,期盼了几年的项目,终于有了市场.内心还是有成就感的. 可是年终沟通,就像是一瓢冷水,从头往下倒.拔凉拔凉的.什么是心寒.什么是希望.想了很多. 我还本想着 ...
- Windows玩转Kubernetes系列4-搭建K8S Dashboard
下载官方yaml文件 最新的配置文件v2.0.0-beta8版本recommended.yaml,UI地址 wget https://raw.githubusercontent.com/kuberne ...
- 如何将博客搬至CSDN
简单聊下对于博客园的印象是技术改变世界,作为一个IT技术人员很乐意把这里当作自己的网上家园,每天在这里分享着精彩的原创内容,看重的不是华丽的外表.诱人的虚名,而是纯净.专注.对技术人员的理解. CSD ...
- HTML5创建高德地图
创建高德地图 功能真的很好很强大,有图有证据! 1.申请key值 去官网2.https://webapi.amap.com/maps?v=1.4.11&key=e22196035aaa10db ...
- 【Android休眠】之Android休眠机制
一.休眠概述 休眠,简而言之就是设备在不需要工作的时候把一些部件.外设关掉(掉电或让它进入低功耗模式). 为什么要休眠呢?一言以蔽之:省电. 休眠分主动休眠和被动休眠.主动休眠:比如我电脑不用了,就通 ...
- UVA12716-连续区间内反向寻因子法
在涉及的题目中如果需要使用连续区间内的数据的因数,可以放弃使用%这种低效的方案,从因数的角度进行,UVA12716中对于代码的优化就利用了这个小技巧. 原题:https://vjudge.net/pr ...
- java中数据类型转换注意事项
1.byte.short.char这三种类型互相做数学运算时都会先提升为int类型后再做运算 char a = 'A'; short b = 1; int num = a + b;//a和b在做运算前 ...
- hdu 2187 悼念512汶川大地震遇难同胞——老人是真饿了(贪心)
新人题:n2的排序就可以过 #include <stdio.h> #include <stdlib.h> int main() { int c,n,i,j,o; ],b[],m ...
- Android_下方弹出菜单的实现
这一功能要用到动画相关知识 实现点击按钮弹出下方输入框,这里点击可弹出一个输入界面,其中包括一个小型计算器. 点击date可弹出datedialog设置date. 1.编写弹出框的布局文件 <? ...
- PHP常见数组函数总结
一.数组的一些关于键名和值的基础操作函数 1.获取数组所有的键或值:array_keys() array_values() $arr_keys = array_keys($array); $arr_v ...