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()


原创粉丝点击