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. vim编辑器未正常关闭时解决方案

    目录 vim编辑器未正常关闭时解决方案 问题描述 .swp..swo文件产生原因 解决方案 后记 hosts文件 sudo命令小记 vim编辑器未正常关闭时解决方案 问题描述 在mac上的/etc目录 ...

  2. Java设计模式(二)设计模式原则

    学习Java设计模式之前,有必要先了解设计模式原则. 开闭原则 定义 一个软件实体如类.模块和函数应该对扩展开放,对修改关闭 用抽象构建框架,用实现扩展细节 优点:提高软件系统的可复用性及可维护性 C ...

  3. Java连载76-基础数据类型包装类型及其方法简介

    一.java中八种基本数据类型对应的包装类型 基本数据类型      包装类型 byte                    java.lang.Byte short                ...

  4. jQuery 判断页面上下滚动

    var t = 0, b = 0; $(window).scroll(function(){ t = $(this).scrollTop(); if(b < t){ console.log('向 ...

  5. C# LINQ学习笔记三:LINQ to OBJECT之操作字符串

    本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5814204.html,记录一下学习过程以备后续查用. 一.统计单词在字符串中出现的次数 请注意,若要执行计数, ...

  6. Python instagram 爬虫项目

    直接介绍一下具体的步骤以及注意点: instagram 爬虫注意点 instagram 的首页数据是 服务端渲染的,所以首页出现的 11 或 12 条数据是以 html 中的一个 json 结构存在的 ...

  7. JavaScript-事件处理程序

    DOM事件流: 1.事件冒泡 2.事件捕获 DOM2事件流: 1.事件捕获阶段 2.处于目标阶段 3.事件冒泡阶段 DOM3事件 事件处理程序: 1.HTML事件处理程序: 例一:<input ...

  8. Latex中遇到 No room for a new \count 问题的解决

    在tex文件中加入etex宏包. \usepackage{etex} 最好加载第一个宏包位置 PDF合并 \documentclass[a4paper]{article}\usepackage{pdf ...

  9. Quartz.NET 2.x教程

    第1课:使用Quartz第2课:工作和触发器第3课:关于工作和JobDetails的更多信息第4课:有关触发器的更多信息第5课:SimpleTriggers第6课:CronTriggers第7课:Tr ...

  10. [国家集训队] 拉拉队排练 - Manacher

    用 Manacher 跑出回文串长,注意这里不需要偶数长度所以不需要对串做一些奇怪的处理 然后用前缀和搞一下,计算答案时跑快速幂即可 #include <bits/stdc++.h> us ...