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
相关文章
|
1月前
|
Python
Python的第一个程序
【4月更文挑战第8天】Python的第一个程序
34 6
|
1月前
|
存储 人工智能 算法
【Python】Yahtzee(掷骰子游戏)模拟程序【独一无二】
【Python】Yahtzee(掷骰子游戏)模拟程序【独一无二】
|
1天前
|
缓存 Shell 开发工具
[oeasy]python0016_在vim中直接运行python程序
在 Vim 编辑器中,可以通过`:!`命令来执行外部程序,例如`:!python3 oeasy.py`来运行Python程序。如果想在不退出Vim的情况下运行当前编辑的Python文件,可以使用`%`符号代表当前文件名,所以`:!python3 %`同样能运行程序。此外,可以使用`|`符号连续执行命令,例如`:w|!python3 %`会先保存文件(`w`)然后运行Python程序。这样,就可以在不离开Vim的情况下完成编辑、保存和运行Python程序的流程。
12 0
|
2天前
|
监控 开发者 Python
Python中记录程序报错信息的实践指南
Python中记录程序报错信息的实践指南
12 1
|
6天前
|
监控 测试技术 持续交付
Python自动化测试代理程序可用性
总之,通过编写测试用例、自动化测试和设置监控系统,您可以确保Python自动化测试代理程序的可用性,并及时发现和解决问题。这有助于提供更可靠和高性能的代理服务。
11 4
|
8天前
|
Python
简单的 Python 计算器程序
这是一个简单的Python计算器程序,实现了加、减、乘、除功能。用户选择运算类型及输入两个数字后,程序依据选择调用相应函数进行计算并显示结果。若输入非法,程序显示错误信息。
32 3
|
10天前
|
网络协议 小程序 数据库
轻松学会Python网络编程,搭建属于自己的聊天室
轻松学会Python网络编程,搭建属于自己的聊天室
|
11天前
|
监控 测试技术 API
Python Web应用程序构建
【4月更文挑战第11天】Python Web开发涉及多种框架,如Django、Flask和FastAPI,选择合适框架是成功的关键。示例展示了使用Flask创建简单Web应用,以及如何使用ORM(如SQLAlchemy)管理数据库。
20 4
|
13天前
|
人工智能 数据库 开发者
Python中的atexit模块:优雅地处理程序退出
Python中的atexit模块:优雅地处理程序退出
10 3
|
15天前
|
存储 索引 Python
Python从入门到精通——1.3.1练习编写简单程序
Python从入门到精通——1.3.1练习编写简单程序