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. Qt编写安防视频监控系统11-动态换肤

    一.前言 Qt中的动态换肤技术是非常一流的,直接调用qApp->setStyleSheet(qss);就可以对整个应用程序进行换肤,如果样式表内容不多,或者对应的贴图不对,效率还是蛮好的,不过据 ...

  2. 比特币区块的hash算法

    Block hashing algorithm Bitcoin mining uses the hashcash proof of work function; the hashcash algori ...

  3. iOS tableview的常用delegate和dataSource执行顺序

    在这次项目中遇到了一个特别奇葩的问题:表视图创建的cell在7以上的系统能正常运行显示,在模拟器上就不能正常实现......为解决这个问题,纠结了好久...... 对在7系统上不显示的猜测: 用mas ...

  4. 解决Java中的HttpServletResponse中文乱码问题

    response.setHeader("Content-type", "textml;charset=UTF-8"); response.setCharacte ...

  5. Redux 视频教程

    视频地址:http://www.imooc.com/learn/744

  6. java 中 this 和 super 说明及在构造器中super()和this()相互调用执行顺序

    this this 表示当前对象 使用上细分的话,this有 this. 和this()的使用情况 ,下面我们开始细撸 this . 使用场景一: 在成员方法中,this.变量名 指带当前对象的变量, ...

  7. selenium3关于ddt数据驱动。。

    from selenium import webdriver import ddt import time import unittest @ddt.ddt class TestLogin(unitt ...

  8. springBoot--组合注解RestController,GetMapping,PostMapping

    一.RestController @RestController 是@Controller和@ResponseBody的缩写 二.@getMapping和PostMapping @GetMapping ...

  9. idea把maven依赖树输出到控制台

    第一步 选中红色方框 第二步 点进去 输入命令:mvn dependency:tree 如果要输出到文件,找到pom文件的位置 进入命令行 输入: mvn dependency:tree >d: ...

  10. [Cometoj#3 D]可爱的菜菜子_线段树_差分_线性基

    可爱的菜菜子 题目链接:https://cometoj.com/contest/38/problem/D?problem_id=1543 数据范围:略. 题解: 首先,如果第一个操作是单点修改,我们就 ...