select —— poll —— epoll
import socket,select
s=socket.socket()
s.setblocking(False)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind(('127.0.0.1',6666))
s.listen()
rlist=[s,]
wlist=[]
erlist=[]
while True:
rs,ws,er=select.select(rlist,wlist,erlist)
print(1)
for i in rs:
if i is s:
con,add=s.accept()
rlist.append(con)
else:
date=i.recv(1024)
if not date:
rlist.remove(i)
print(date.decode())
i.send(date)
for i in erlist:
print(i)
——select 服务端
import socket,select,time
s=socket.socket()
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind(('127.0.0.1',6666))
s.listen()
poll=select.poll()
poll_dic={s.fileno(): s,}
poll.register(s, select.POLLIN | select.POLLERR)
while True:
try:
events=poll.poll()
for fd,event in events:
print(fd,event)
if fd == s.fileno():
con,add=s.accept()
poll_dic[con.fileno()] = con
poll.register(con,select.POLLIN | select.POLLERR)
elif event == select.POLLIN: date = poll_dic[fd].recv(1024)
print(date.decode())
if not date:
print('进来了')
poll.unregister(fd)
poll_dic[fd].close()
del poll_dic[fd] except:
poll.unregister(s)
——poll 服务端
import socket,select
s=socket.socket()
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind(('127.0.0.1',6666))
s.listen()
poll=select.poll()
poll_dict={s.fileno():s}
def a(fd):
poll.unregister(fd)
poll_dict[fd].close()
del poll_dict[fd] def main():
poll.register(s,select.POLLIN | select.POLLERR)
while True:
p=poll.poll()
for fd,event in p:
if fd == s.fileno():
con, addr = s.accept()
poll.register(con, select.POLLIN | select.POLLERR)
poll_dict[con.fileno()]=con
elif event == select.POLLIN:
date=poll_dict[fd].recv(1024)
if not date:
a(fd)
continue
print(date.decode(),111)
poll_dict[fd].send(date)
elif event == select.POLLERR:
a(fd)
if __name__ == '__main__':
main()
——POLL加一服务端
#使用poll改为epoll,更改创建模式,更改对应的事件名即可
import socket,select,time
s=socket.socket()
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind(('127.0.0.1',6666))
s.listen()
poll=select.epoll()
poll_dic={s.fileno(): s,}
poll.register(s, select.EPOLLIN | select.EPOLLERR)
while True:
try:
events=poll.poll()
for fd,event in events:
print(fd,event,'')
print(fd,event)
if fd == s.fileno():
con,add=s.accept()
poll_dic[con.fileno()] = con
poll.register(con,select.EPOLLIN | select.EPOLLERR)
elif event == select.EPOLLIN:
date = poll_dic[fd].recv(1024)
print(date.decode())
if not date:
print('进来了')
poll.unregister(fd)
poll_dic[fd].close()
del poll_dic[fd]
poll_dic[fd].send(date)
except:
poll.unregister(s)
【poll 改为 epoll方法】
import socket,selectors
s=socket.socket()
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind(('127.0.0.1',6666))
s.listen()
epoll=selectors.DefaultSelector()
def accept_(s):
con,addr=s.accept()
epoll.register(con,selectors.EVENT_READ,recv_) def recv_(con):
try:
date=con.recv(1024)
if not date:
raise ''
print(date.decode())
con.send(date)
except:
epoll.unregister(con)
con.close()
print('断开连接') def main():
epoll.register(s,selectors.EVENT_READ,accept_)
while True:
s_eoll=epoll.select()# #检测所有的fileobj,是否有完成wait data的
for key,mask in s_eoll:
ac=key.data #这是绑定事件函数,文件指针accept_
print(key,'这是KEY')
ac(key.fileobj,mask)#拿sock对象文件描述符(fd)
if __name__ == '__main__':
main()
epoll-使用selectos模块
# 写一个聊天室
# 功能:类似QQ
# 1,进入聊天室需要输入姓名,姓名不能重复
# 2 有人进入聊天室会向其他人发送通知
# 3 一个发消息,其他人会收到消息
# 4 某人退出聊天室,其他人也会收到通知,
###服务端
import socket,select,time
epoll=select.epoll()
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) socket_dict={s.fileno():s}
epoll.register(s.fileno(),select.EPOLLIN | select.EPOLLERR)
s.bind(('127.0.0.1',6666))
s.listen()
list_dict={}
while True:
event=epoll.poll()
for fd,event_ in event:
if fd == s.fileno():
con,addr = s.accept()
socket_dict[con.fileno()]=con
epoll.register(con.fileno(),select.EPOLLIN | select.EPOLLERR)
elif event_ == select.EPOLLIN:
date = socket_dict[fd].recv(1024)
if not date:# 处理断开的连接 _收尸处理
epoll.unregister(socket_dict[fd].fileno())
socket_dict[fd].close()
try:
for i in list_dict:
if fd == i :
continue #print(list_dict[fd])
exit_name = (list_dict[fd]+'退出').encode()
socket_dict[i].send(exit_name) #print('发送完成')
del list_dict[fd]
del socket_dict[fd]
continue
except :print('重复姓名客户端连接 ')
else:
if fd not in list_dict: #判断FD在不在list_dict,不在则进入存入fd:name
date_de = date.decode()#获取发送过来的名字
if date_de not in list_dict.values(): #判断列表内是否有重复name
socket_dict[fd].send('没有重复姓名'.encode())
for i in list_dict:#遍历文件描述符
try:
date_de_1 = ('\n'+date_de+'加入!').encode()
socket_dict[i].send(date_de_1)
except:
print('此时出错')
list_dict[fd] = date_de
else:
#print(date_de)
socket_dict[fd].send('重复姓名'.encode())
else:
#print('这是list_dict',list_dict)# fd 在list_dict中,循环发送接收到的信息
for i in list_dict:
if i == fd:
pass
else:
date_2=('\n%s说:'%list_dict[fd]).encode()+date
socket_dict[i].send(date_2)
#客户端,使用简单的多进程fork() 来完工 import socket,time,os,sys
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
inp = ''
try:
while not inp:
inp = input('进行连接,请输入名:').encode()
except KeyError:
exit()
try:
s.connect(('127.0.0.1',6666))
s.send(inp)
verify = s.recv(1024).decode()
try:
if verify == '重复姓名':
raise verify
except:
print(verify)
exit()
except:
print('连接失败')
exit()
def send_msg(s):
try:
while True:
inp = input('输入内容:')
if inp == '':
continue
elif inp == 'q':
sys.exit(1)
inp = inp.encode()
s.send(inp)
except KeyboardInterrupt:
sys.exit()
def recv_msg(s):
while True:
time.sleep(1)
date=s.recv(1024).decode()
print(date+'\n输入内容:',end='')
pid,status= os.waitpid(-1,os.WNOHANG)
#print('pid',pid,status)
if pid != 0:
sys.exit() pid = os.fork()
if pid < 0 :
print('创建失败')
elif pid == 0:
send_msg(s)
else:
recv_msg(s)
select —— poll —— epoll的更多相关文章
- select/poll/epoll on serial port
In this article, I will use three asynchronous conferencing--select, poll and epoll on serial port t ...
- Linux下select&poll&epoll的实现原理(一)
最近简单看了一把 linux-3.10.25 kernel中select/poll/epoll这个几个IO事件检测API的实现.此处做一些记录.其基本的原理是相同的,流程如下 先依次调用fd对应的st ...
- Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)
一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 简单的启动线程语法 def run(name): ...
- 多进程、协程、事件驱动及select poll epoll
目录 -多线程使用场景 -多进程 --简单的一个多进程例子 --进程间数据的交互实现方法 ---通过Queues和Pipe可以实现进程间数据的传递,但是不能实现数据的共享 ---Queues ---P ...
- Python自动化 【第十篇】:Python进阶-多进程/协程/事件驱动与Select\Poll\Epoll异步IO
本节内容: 多进程 协程 事件驱动与Select\Poll\Epoll异步IO 1. 多进程 启动多个进程 进程中启进程 父进程与子进程 进程间通信 不同进程间内存是不共享的,要想实现两个进程间 ...
- select,poll,epoll的归纳总结区分
Select.Poll与Epoll比较 以下资料都是来自网上搜集整理.引用源详见文章末尾. 1 Select.Poll与Epoll简介 Select select本质上是通过设置或者检查存放fd标志位 ...
- 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】
下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...
- select.poll,epoll的区别与应用
先讲讲同步I/O的五大模型 阻塞式I/O, 非阻塞式I/O, I/O复用,信号驱动I/O(SIGIO),异步I/O模型 而select/poll/epoll属于I/O复用模型 select函数 该函数 ...
- select poll epoll三者之间的比较
一.概述 说到Linux下的IO复用,系统提供了三个系统调用,分别是select poll epoll.那么这三者之间有什么不同呢,什么时候使用三个之间的其中一个呢? 下面,我将从系统调用原型来分析其 ...
- select, poll, epoll
select的一 个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024 http://www.cnblogs.com/bigwangdi/p/3182958.html ...
随机推荐
- sed例子
以care.log这个log文件为例, care.log: 05:44:31,816 DEBUG RawAggregationWorker:70 - LTS is working on Raw Dat ...
- k8s install kubeadm网络原因访问不了谷哥and gpg: no valid OpenPGP data found. 解决办法
gpg: no valid OpenPGP data found. 解决办法 待做.................................... 卡助在这curl -s https://pa ...
- .Netcore 2.0 Ocelot Api网关教程(10)- Headers Transformation
本文介绍Ocelot中的请求头传递(Headers Transformation),其可以改变上游request传递给下游/下游response传递给上游的header. 1.修改ValuesCont ...
- 《剑指offer》字符串专题 (牛客11.01)
字符串的题目难度不一,涉及到的考点有字符串处理.字符串匹配(自动机.正则).模拟,以及递归.动态规划等算法. 难度 题目 知识点 ☆ 02. 替换空格 从后往前 ☆☆ 27. 字符串的排列 回溯,St ...
- DS博客作业--07查找
目录 DS博客作业--07查找 1.本周学习总结(0--2分) 1.思维导图 2.谈谈你对查找运算的认识及学习体会. 2.PTA实验作业(6分) 2.1.题目1:6-1 二叉搜索树的操作集 (30 分 ...
- bitmap位图原理和实现
引子 首先通过一道题来理解什么是bitmap. 题目:我有40亿个整数,再给一个新的整数,我需要判断新的整数是否在40亿个整数中,你会怎么做? 分析: 假设一个int占4个字节(32位),40个亿个整 ...
- leveldb单元测试之宏定义源码剖析
前言 leveldb 是一个库,没有 main() 函数入口, 故非常难理清其中的代码逻辑.但好在库中有非常多的单元测试代码,帮助读者理解其中的各个模块的功能.然而,测试代码个人觉得一开始看时非常费解 ...
- 配置了Ubuntu环境变量,系统启动不了
修改了etc/init.d/rcS文件后重启后Ubuntu起不来了, 开启按shift+e或者直接选择,进入恢复模式 进入root shell 执行这个命令 可以有写入权限,重新挂载 mount - ...
- Vue.directive()的用法和实例
官网实例: https://cn.vuejs.org/v2/api/#Vue-directive https://cn.vuejs.org/v2/guide/custom-directive.html ...
- 实时监控服务器某个端口状态TCPing
在给客户做运维服务期间,发现了一个奇怪的现象:备份系统(第三方国产)告警日志显示,每天晚上备份服务器的客户端在3点左右离线然后上线,再离线再上线,每晚两次,很是诡异. 联系了厂家技术支持,前后花了两天 ...