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多路复用的更多相关文章

  1. Python之路,Day9 , IO多路复用(番外篇)

    同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. ...

  2. 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

    下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...

  3. Python网络编程:IO多路复用

    io多路复用:可以监听多个文件描述符(socket对象)(文件句柄),一旦文件句柄出现变化,即可感知. sk1 = socket.socket() sk1.bind(('127.0.0.1',8001 ...

  4. Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程

    1.使用select模拟socketserver伪并发处理客户端请求,代码如下: import socket import select sk = socket.socket() sk.bind((' ...

  5. python协程和IO多路复用

     协程介绍                                                                                                ...

  6. 以python理解Linux的IO多路复用,select、poll、epoll

    题外话 之前在看Unix环境高级编程的时候,看完高级IO那一章,感觉自己萌萌哒,0.0 ,有点囫囵吞枣的感觉,之后翻了几篇博客,从纯系统的角度理解,稍微有了点概念,以这两篇为例,可以以后参考: htt ...

  7. python selectors模块实现 IO多路复用机制的上传下载

    import selectorsimport socketimport os,time BASE_DIR = os.path.dirname(os.path.abspath(__file__))''' ...

  8. IO多路复用(转)

    原文:Python之路,Day9 , IO多路复用(番外篇) 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文 ...

  9. 同步IO与一部IO、IO多路复用(番外篇)select、poll、epoll三者的区别;blocking和non-blocking的区别 synchronous IO和asynchronous IO的区别

    Python之路,Day9 , IO多路复用(番外篇)   同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. ...

随机推荐

  1. 安装TensorFlow失败

    ERROR: Could not find a version that satisfies the requirement tensorflow==2.1.0 (from versions: non ...

  2. Elasticsearch启动、停止脚本

    注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 本文源链接:https://www.cnblogs.com/chloneda/p/es-shell ...

  3. mnist手写数字问题初体验

    上一篇我们提到了回归问题中的梯度下降算法,而且我们知道线性模型只能解决简单的线性回归问题,对于高维图片,线性模型不能完成这样复杂的分类任务.那么是不是线性模型在离散值预测或图像分类问题中就没有用武之地 ...

  4. 在生产环境中碰见的JSP木马-sunziren

    写在前面,本文仅做为技术交流的用途,请不要使用本文中的技术破坏他人的网站及系统,因为这是违法的!!!本人不负任何法律责任!!! 19年1月份,发现了一个JSP木马文件,当时觉得有点奇怪的是,这个文件没 ...

  5. gulp常用插件之gulp-useref使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-useref这是一款可以将HTML引用的多个CSS和JS合并起来,减小依赖的文件个数,从而减少浏览器发起的请求次数.gulp-usere ...

  6. java9小工具jshell

    1.jshell是jdk9引入的小工具 2.启动jshell 在命令行输入jshell 3.使用jshell 比如定义a=10;b=20;输出a+b的结果,有如下两种方法 方法1:代码写在一行,回车直 ...

  7. 利用GRC进行安全研究和审计 – 将无线电信号转换为数据包(转)

    0x00 介绍 InGuardians作为一家从事信息安全研究和咨询的公司,自创立以来不但关注着web应用的渗透测试,网络取证,嵌入式设备等领域也致力于无线网络的评估方法上面的研究.在期间无线网络评估 ...

  8. Dubbo服务暴露分析

    Dubbo的服务暴露是一个重要的特性,了解其机制很重要.之前有很多人写了有关的源代码分析,在本文中不再重新分析.官方文档中的一篇写的就很好,本文主要是有关内容进行补充与总结. 传送门:服务导出 为什么 ...

  9. 解决vmware每次打开无法上网

    vmware网络配置好了,但是每次打开都无法上网,记录下 在计算机管理中启动这几个服务,就ok了

  10. [CF1304E] 1-Trees and Queries - LCA

    由于可以走重边,所以任意一条路径长 + 2 仍然对应至少一条合法路径 很显然我们有 \(3\) 种基本路径 不经过 \((x,y)\) 经过 \(x \to y\) 经过 \(y \to x\) 假设 ...