python epoll聊天室程序

2023-01-31 02:01:20 python 程序 聊天室
 仿照《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() 
程序运行如图:
 

相关文章