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. mud那些坑 find_object问题

    find_object  find_object 没有找到对象时  实际上会load_obejct 一次,需要设定一个标记表示 find_obejct 找出来的 对象和需要对比的对象有什么不同 只要n ...

  2. 五指MUD协议

    //MUD转义协议 #ifndef __WZMUD__ #define __WZMUD__ #define WZKEY "ZWUxMTIyMDAwMw==" #define ESA ...

  3. django项目添加路由----返回给客户端内容-----windows中的python

    django项目添加路由 url函数的第一个参数是匹配url路径的正则表达式,第2个参数是路由函数 第一个正则表达式是r'^$',其中r表示正则表达式字符串不对转义符进行转义.“^”表示匹配URL路径 ...

  4. 【leetcode_easy】551. Student Attendance Record I

    problem 551. Student Attendance Record I 题意: solution: class Solution { public: bool checkRecord(str ...

  5. whereis which type find

    1. whereis  name whereis命令只能用于搜索程序名,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 2. wh ...

  6. window环境下zookeeper的安装(自用---仅供参考)

    转自: https://www.cnblogs.com/ysw-go/p/11396343.html 第一部分:单机模式 1)下载地址:http://www.pirbot.com/mirrors/ap ...

  7. .net 结合FFMPEG

    读取流 https://blog.csdn.net/vanjoge/article/details/79657874 基于设备,推流 https://blog.csdn.net/lxbwolf/art ...

  8. 鼠标拖拉div宽度

    先看效果 先进入页面 当鼠标停留在中间div时,鼠标变成双箭头 点击拖拉 往右边拉 往最左边拉 代码 <!DOCTYPE html> <html> <head> & ...

  9. last 和 lastb 命令

    NAME last - show listing of last logged in users 数据源:/var/log/wtmp 文件 lsstb - show listing of last l ...

  10. 阿里云ECS服务器 java JDK安装和配置 mysql安装和配置

    最近配置了一下阿里云ecs服务的服务器环境,主要对java jdk环境的安装和配置,以及数据库mysql的安装和配置,趁着热乎,记录一下! 服务器用的系统是ubuntu_16_04_64的,版本16. ...