python select poll epoll
来源:互联网 发布:租房软件哪个靠谱 编辑:程序博客网 时间:2024/06/05 18:39
select:
#!/usr/bin/python# coding=utf-8import socketimport selectimport queueimport tracebackimport sysserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server.setblocking(False)server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)addr = ("192.168.249.132", 5050)server.bind(addr)server.listen(5)rlist = [server]wlist = []xlist = []message_queue = {}while True: inputs, outputs, errs = select.select(rlist, wlist, xlist) for sock in inputs: if sock == server: conn, address = server.accept() rlist.append(conn) message_queue[conn] = queue.Queue() else: try: data = sock.recv(1024) if data: print('收到客户端[{0}]数据:{1}'.format(sock.getpeername(), data.decode())) message_queue[sock].put(data) if sock not in wlist: wlist.append(sock) except socket.error as e: rlist.remove(sock) if sock in message_queue.keys(): del message_queue[sock] # sock.close() for sock in outputs: try: if message_queue.get(sock) and not message_queue[sock].empty(): data = message_queue[sock].get_nowait() sock.send(data) else: wlist.remove(sock) except: t, v, tb = sys.exc_info() print(t, v) traceback.print_exc() wlist.remove(sock) if sock in message_queue.keys(): del message_queue[sock]
poll:
#!/usr/bin/python# coding=utf-8import selectimport socketimport queueimport tracebackimport sysserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server.setblocking(False)server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)ser_addr = ('192.168.249.132', 5050)server.bind(ser_addr)server.listen(5)poll = select.poll()poll.register(server.fileno(), select.POLLIN)fdsets = {server.fileno(): server}message_queue = {}try: while True: for fd, event in poll.poll(): if event & select.POLLIN: if fd == server.fileno(): conn, addr = server.accept() conn.setblocking(False) poll.register(conn.fileno(), select.POLLIN) fdsets[conn.fileno()] = conn message_queue[conn.fileno()] = queue.Queue() else: sock = fdsets[fd] try: data = sock.recv(1024) if data: print("收到客户端[{0}]数据:{1}".format(sock.getpeername(), data.decode())) message_queue[fd].put(data) poll.modify(fd, select.POLLOUT) except socket.error: t, v, tb = sys.exc_info() traceback.print_exc() poll.unregister(fd) # fdsets[fd].close() if fd in message_queue: del message_queue[fd] elif event & select.POLLOUT: try: sock = fdsets[fd] if fd in message_queue and not message_queue[fd].empty(): data = message_queue[fd].get_nowait() sock.sendall(data) else: poll.modify(fd, select.POLLIN) except: traceback.print_exc() poll.unregister(fd) # fdsets[fd].close() if fd in message_queue: del message_queue[fd]finally: traceback.print_exc() poll.unregister(server.fileno()) server.close()
epoll:
import socketimport selectimport queueimport sysimport tracebackimport logginglogger = logging.getLogger("aaa")logger.setLevel(logging.DEBUG)formatter = logging.Formatter("")filehandler = logging.FileHandler("aaa.log")filehandler.setLevel(logging.ERROR)filehandler.setFormatter(formatter)logger.addHandler(filehandler)streamhandler = logging.StreamHandler()logger.addHandler(streamhandler)serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)serveraddr = ("192.168.249.132", 5050)serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)serversocket.setblocking(False)serversocket.bind(serveraddr)serversocket.listen(10)epoll = select.epoll()epoll.register(serversocket.fileno(), select.EPOLLIN)fd_to_socket = {}fd_to_socket[serversocket.fileno()] = serversocketwhile True: events = epoll.poll(10) if not events: continue for fd, event in events: register_socket = fd_to_socket[fd] if fd == serversocket.fileno(): connection, addr = serversocket.accept() print("客户端[{0}]:加入".format(connection.getpeername())) connection.setblocking(False) epoll.register(connection.fileno(), select.EPOLLIN) fd_to_socket[connection.fileno()] = connection elif event & select.EPOLLIN: try: data = register_socket.recv(1024).decode() if data: print("收到客户端[{0}]数据:{1}".format(register_socket.getpeername(), data)) epoll.modify(fd, select.EPOLLOUT) except: epoll.unregister(fd) # register_socket.close() del fd_to_socket[fd] t, v, tb = sys.exc_info() print(t, v) traceback.print_exc() traceback.print_tb(tb) elif event & select.EPOLLOUT: data = "abcde" register_socket.send(data.encode()) epoll.modify(fd, select.EPOLLIN) elif event & select.EPOLLHUP: print("客户端退出") epoll.unregister(fd) register_socket.close() del fd_to_socket[fd]
client:
#!/usr/bin/python# coding:utf-8import socket#创建socket对象clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#设置ip和端口serveraddress = ("192.168.249.132", 5050)#连接clientsocket.connect(serveraddress)try: while True: data = input("please input:") clientsocket.sendall(data.encode()) server_data = clientsocket.recv(1024) print("收到服务端[{0}]数据:{1}".format(serveraddress, server_data.decode()))finally: clientsocket.close()
阅读全文
0 0
- python select poll epoll
- python socket的select,poll,epoll
- select、Poll、epoll比较。
- select,poll,epoll区别
- select,poll,epoll用法
- select, poll, epoll
- select、poll、epoll
- select,poll,epoll区别
- select、poll和epoll
- socket-select ,poll ,epoll
- select poll epoll区别
- select、poll和epoll
- select, poll, epoll
- select,epoll,poll比较
- poll, select, epoll
- select、Poll、epoll比较
- select、poll和epoll
- select,poll,epoll总结
- Word通配符的使用
- Java分布式应用技术架构介绍
- Java基础知识点
- AS连接不上手机
- 谁说数据少就不能用深度学习?
- python select poll epoll
- QT中涉及到数据传递的几种情况分析
- 使用mybatis-generator-maven-plugin生成mapper.xml带来的Duplicate entry ‘xxx’ for key ‘PRIMARY’问题
- 2017 Android GitHub 常用开源框架汇总
- mysql profile功能
- tomcat里配置多数据源(数据库连接池) jndi 和项目连接 ssh框架
- 那么久
- Android开源项目推荐之【角标“徽章”简介】
- http中 post和get