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. Java8 根据对象某个属性值去重

    list中的对象某个属性存在重复时将重复的对象去重 //根据skuAttrValueName值去重 List<SkuValue> uniqueSkuValues = skuValues.s ...

  2. getchwd() 函数返回当前工作目录。

    getchwd() 函数返回当前工作目录.

  3. onethink多图上传

    模板处理, 可以参考 checkbox 的. 注:edit 方法的 基本一样,需要先把已有的数据展示出来,绑定双击事件,删除图片 需要先绑定给已经展示出来的图片, uploadPicture 的cal ...

  4. OpenCV.物体识别

    1.度娘:“OpenCV 物体识别” 1.1.opencv实时识别指定物体 - 诺花雨的博客 - CSDN博客.html(https://blog.csdn.net/qq_27063119/artic ...

  5. CentOS 7 利用qemu模拟ARM vexpress A9开发板

    听说qemu用于仿真arm很不错,今日就来试了一把.由于刚刚开始,了解的并不多.本文仅仅记录Qemu装载Linux kernel和busybox根文件系统的过程.后续将会深入了解仿真的其他内容. 先上 ...

  6. Orderly Class

    题目链接: https://nanti.jisuanke.com/t/40449 题目大意:给出两个长度相同的不同字符串A, B.可以对A的任意长度区间进行一次翻转,问有多少种方法可以使得翻转后两字符 ...

  7. RestTemplate实践(及遇到的问题)

    在微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Apache的Http Client.Netty的异步 ...

  8. Docker 安装 Tomcat

    查找Docker Hub上的tomcat镜像 docker search tomcat 取官方的镜像 docker pull tomcat 使用tomcat镜像 创建目录tomcat,用于存放后面的相 ...

  9. java中package包

    一个.java文件内部有一个.而且只能有一个public类,类名必须与文件名完全一致. 在一个.java文件的开头使用package关键字,作用是指出这个编译单元属于该package的一个库的一部分. ...

  10. 小记------phoenix安装搭建

        1.下载与hbase对应版本的phoenix      http://phoenix.apache.org/download.html   2.解压  tar -zxvf apache-pho ...