python epoll聊天室程序

 仿照《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() 
程序运行如图:
 

本文转自 li_qinshan 51CTO博客,原文链接:http://blog.51cto.com/share/1183572
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值