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

  1. select/poll/epoll on serial port

    In this article, I will use three asynchronous conferencing--select, poll and epoll on serial port t ...

  2. Linux下select&poll&epoll的实现原理(一)

    最近简单看了一把 linux-3.10.25 kernel中select/poll/epoll这个几个IO事件检测API的实现.此处做一些记录.其基本的原理是相同的,流程如下 先依次调用fd对应的st ...

  3. Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)

    一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 简单的启动线程语法 def run(name): ...

  4. 多进程、协程、事件驱动及select poll epoll

    目录 -多线程使用场景 -多进程 --简单的一个多进程例子 --进程间数据的交互实现方法 ---通过Queues和Pipe可以实现进程间数据的传递,但是不能实现数据的共享 ---Queues ---P ...

  5. Python自动化 【第十篇】:Python进阶-多进程/协程/事件驱动与Select\Poll\Epoll异步IO

    本节内容: 多进程 协程 事件驱动与Select\Poll\Epoll异步IO   1.  多进程 启动多个进程 进程中启进程 父进程与子进程 进程间通信 不同进程间内存是不共享的,要想实现两个进程间 ...

  6. select,poll,epoll的归纳总结区分

    Select.Poll与Epoll比较 以下资料都是来自网上搜集整理.引用源详见文章末尾. 1 Select.Poll与Epoll简介 Select select本质上是通过设置或者检查存放fd标志位 ...

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

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

  8. select.poll,epoll的区别与应用

    先讲讲同步I/O的五大模型 阻塞式I/O, 非阻塞式I/O, I/O复用,信号驱动I/O(SIGIO),异步I/O模型 而select/poll/epoll属于I/O复用模型 select函数 该函数 ...

  9. select poll epoll三者之间的比较

    一.概述 说到Linux下的IO复用,系统提供了三个系统调用,分别是select poll epoll.那么这三者之间有什么不同呢,什么时候使用三个之间的其中一个呢? 下面,我将从系统调用原型来分析其 ...

  10. select, poll, epoll

    select的一 个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024 http://www.cnblogs.com/bigwangdi/p/3182958.html ...

随机推荐

  1. mybatis plus foreach 的用法

    一: foreach 用于 select * from tablename where colname in (A,B,C……); 1:service 层: Set<String> tea ...

  2. 【401】Python 求合数的所有质数因子

    对于这样的一个题目来说,出看来,可能会想到判断是否为质数,但其实并不需要. 只要按照从2开始遍历,只要遇到可以整除的就是想要的质数,理由是,如果遇到合数的话,那么在此之前一定会遇到这个合数的质因子,因 ...

  3. Android之FrameWork

    1 Activity的生命周期和启动模式 1.1 Activity的生命周期全面分析 用户正常使用情况下的生命周期 & 由于Activity被系统回收或者设备配置改变导致Activity被销毁 ...

  4. 人人都可以写的可视化Python小程序第二篇:旋转的烟花

    兴趣是最好的老师 枯燥的编程容易让人放弃,兴趣才是最好的老师.无论孩子还是大人,只有发现这件事情真的有趣,我们才会非常执着的去做这件事,比如打游戏.如果编程能像玩游戏一样变得有趣,我相信很多人就特别愿 ...

  5. iOS开发之——keychain使用

    iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式.每个ios程序都有一个独立的keychain存储.从ios 3.0开始,跨程序分享keychain变得可行. 使 ...

  6. swift 第十四课 可视化view: @IBDesignable 、@IBInspectable

    以前应objctiew-c 写项目的时候,就知道有这两个关键字,现在用swift了.用法稍作改变,基本用法还是一致的 虽然使用这个之后,有时候会报错的非常的莫名其妙----(其实还是自己技术不够牛…… ...

  7. mysqlslap 性能测试

    --create-schema=name 指定测试的数据库名,默认是mysqlslap --engine=name 创建测试表所使用的存储引擎,可指定多个 --concurrency=N 模拟N个客户 ...

  8. Git速成学习第二课:管理修改与删除文件

    Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng.com/ 管理修改 首先我们需要明确,为什么说Git管理的是修改而不是文件呢? 我们首先对于已有的read ...

  9. K/3 Cloud 单据关联查询

    销售出库单 下推 销售退货单,如何获知他们的关联关系?T_SAL_OUTSTOCKENTRY 是销售出库单分录T_SAL_RETURNSTOCKENTRY 是销售退货单分录T_SAL_RETURNST ...

  10. js中函数总结(1)

    8.1函数定义js的函数可以嵌套在其他函数的定义中,这样它们就可以访问它们被定义时所处的作用域中的任何变量.意味着js函数构成了一个闭包:function name(){} 特殊的:函数表达式有时定义 ...