python epoll聊天室程序

发布时间:2019-08-27 08:03:04编辑:auto阅读(1684)

     仿照《how to use linux epoll with python》写的一个聊天室程序,比较简单。
    python版本:2.7.3
     
    1. #!/usr/bin/python  
    2. # -*- coding:utf-8 -*- 
    3.  
    4. import socket, select 
    5.  
    6. for res in socket.getaddrinfo('0.0.0.0'1025, socket.AF_INET, socket.SOCK_STREAM): 
    7.     fa, socktype, proto, canonname, sa = res 
    8.  
    9. SockServer = socket.socket(fa, socktype, proto)  
    10. SockServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1
    11. SockServer.bind(sa) 
    12. SockServer.listen(5
    13.  
    14. epoll = select.epoll() 
    15. epoll.register(SockServer.fileno(), select.EPOLLIN) 
    16.  
    17. try
    18.     conns={}; addrs={} 
    19.  
    20.     while True
    21.         for fileno, event in epoll.poll(1): 
    22.             if fileno == SockServer.fileno(): 
    23.                 conn, addr = SockServer.accept() 
    24.  
    25.                 epoll.register(conn.fileno(), select.EPOLLIN) 
    26.                 conns[conn.fileno()] = conn 
    27.                 addrs[conn.fileno()] = addr 
    28.  
    29.                 conn.send("--- Welcome to server. Type EXIT to quit. ---\n"
    30.                 print '[server]: accept connection from %s<%s>' % addr 
    31.  
    32.             elif event & select.EPOLLIN: 
    33.                 message = conns[fileno].recv(1024
    34.                 print "%s<%s> say: " % (addrs[fileno][0], addrs[fileno][1]) + message.strip() 
    35.  
    36.                 if b'EXIT' in message: 
    37.                     epoll.modify(fileno, select.EPOLLOUT) 
    38.  
    39.                 for key in conns.keys(): 
    40.                     if key != fileno: 
    41.                         conns[key].send('%s<%s> say: %s' % (addrs[key][0], addrs[key][1], message)) 
    42.  
    43.             elif event & select.EPOLLOUT: 
    44.                 epoll.modify(fileno, 0
    45.                 conns[fileno].shutdown(socket.SHUT_RDWR) 
    46.  
    47.             elif event & select.EPOLLHUP: 
    48.                 epoll.unregister(fileno) 
    49.                 conns[fileno].close() 
    50.                 print '[server]: %s<%s> quit.' % addrs[fileno]  
    51.  
    52.                 del conns[fileno] 
    53.                 del addrs[fileno] 
    54.  
    55. finally
    56.     epoll.unregister(SockServer.fileno()) 
    57.     epoll.close() 
    58.     SockServer.close() 
    程序运行如图:
     

关键字