免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1592 | 回复: 0
打印 上一主题 下一主题

python中使用epoll开发服务端程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:54 |只看该作者 |倒序浏览

服务端:

Python代码
  1. import socket, logging   
  2. import select, errno   
  3.   
  4. logger = logging.getLogger("network-server")   
  5.   
  6. def InitLog():   
  7.     logger.setLevel(logging.DEBUG)   
  8.   
  9.     fh = logging.FileHandler("network-server.log")   
  10.     fh.setLevel(logging.DEBUG)   
  11.     ch = logging.StreamHandler()   
  12.     ch.setLevel(logging.ERROR)   
  13.        
  14.     formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")   
  15.     ch.setFormatter(formatter)   
  16.     fh.setFormatter(formatter)   
  17.        
  18.     logger.addHandler(fh)   
  19.     logger.addHandler(ch)   
  20.   
  21.   
  22. if __name__ == "__main__":   
  23.     InitLog()   
  24.        
  25.     try:   
  26.         listen_fd = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)   
  27.     except socket.error, msg:   
  28.         logger.error("create a socket failed")   
  29.        
  30.     try:   
  31.         listen_fd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)   
  32.     except socket.error, msg:   
  33.         logger.error("setsocketopt error")   
  34.        
  35.     try:   
  36.         listen_fd.bind((''2003))   
  37.     except socket.error, msg:   
  38.         logger.error("listen file id bind ip error")   
  39.        
  40.     try:   
  41.         listen_fd.listen(10)   
  42.     except socket.error, msg:   
  43.         logger.error(msg)   
  44.        
  45.     try:   
  46.         epoll_fd = select.epoll()   
  47.         epoll_fd.register(listen_fd.fileno(), select.EPOLLIN)   
  48.     except select.error, msg:   
  49.         logger.error(msg)   
  50.            
  51.     connections = {}   
  52.     addresses = {}   
  53.     datalist = {}   
  54.     while True:   
  55.         epoll_list = epoll_fd.poll()   
  56.         for fd, events in epoll_list:   
  57.             if fd == listen_fd.fileno():   
  58.                 conn, addr = listen_fd.accept()   
  59.                 logger.debug("accept connection from %s, %d, fd = %d" % (addr[0], addr[1], conn.fileno()))   
  60.                 conn.setblocking(0)   
  61.                 epoll_fd.register(conn.fileno(), select.EPOLLIN | select.EPOLLET)   
  62.                 connections[conn.fileno()] = conn   
  63.                 addresses[conn.fileno()] = addr   
  64.             elif select.EPOLLIN & events:   
  65.                 datas = ''  
  66.                 while True:   
  67.                     try:   
  68.                         data = connections[fd].recv(10)   
  69.                         if not data and not datas:   
  70.                             epoll_fd.unregister(fd)   
  71.                             connections[fd].close()   
  72.                             logger.debug("%s, %d closed" % (addresses[fd][0], addresses[fd][1]))   
  73.                             break  
  74.                         else:   
  75.                             datas += data   
  76.                     except socket.error, msg:   
  77.                         if msg.errno == errno.EAGAIN:   
  78.                             logger.debug("%s receive %s" % (fd, datas))   
  79.                             datalist[fd] = datas   
  80.                             epoll_fd.modify(fd, select.EPOLLET | select.EPOLLOUT)   
  81.                             break  
  82.                         else:   
  83.                             epoll_fd.unregister(fd)   
  84.                             connections[fd].close()    
  85.                             logger.error(msg)   
  86.                             break           
  87.             elif select.EPOLLHUP & events:   
  88.                 epoll_fd.unregister(fd)   
  89.                 connections[fd].close()   
  90.                 logger.debug("%s, %d closed" % (addresses[fd][0], addresses[fd][1]))    
  91.             elif select.EPOLLOUT & events:   
  92.                 sendLen = 0                
  93.                 while True:   
  94.                     sendLen += connections[fd].send(datalist[fd][sendLen:])   
  95.                     if sendLen == len(datalist[fd]):   
  96.                         break  
  97.                 epoll_fd.modify(fd, select.EPOLLIN | select.EPOLLET)                    
  98.             else:   
  99.                 continue  

 客户端程序

 

Python代码
  1. import socket   
  2. import time   
  3. import logging   
  4.   
  5. logger = logging.getLogger("network-client")   
  6. logger.setLevel(logging.DEBUG)   
  7.   
  8. fh = logging.FileHandler("network-client.log")   
  9. fh.setLevel(logging.DEBUG)   
  10. ch = logging.StreamHandler()   
  11. ch.setLevel(logging.ERROR)   
  12.   
  13. formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")   
  14. ch.setFormatter(formatter)   
  15. fh.setFormatter(formatter)   
  16.   
  17. logger.addHandler(fh)   
  18. logger.addHandler(ch)   
  19.   
  20. if __name__ == "__main__":   
  21.     try:   
  22.         connFd = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)   
  23.     except socket.error, msg:   
  24.         logger.error(msg)   
  25.        
  26.     try:   
  27.         connFd.connect(("192.168.31.226"2003))   
  28.         logger.debug("connect to network server success")   
  29.     except socket.error,msg:   
  30.         logger.error(msg)   
  31.        
  32.     for i in range(111):   
  33.         data = "The Number is %d" % i   
  34.         if connFd.send(data) != len(data):   
  35.             logger.error("send data to network server failed")   
  36.             break  
  37.         readData = connFd.recv(1024)   
  38.         print readData   
  39.         time.sleep(1)   
  40.        
  41.     connFd.close()  
 这是个很简单的C/S模型的程序,流程其实和C语言相差不大,就是为了学学python中的基本语法,以及logging,select,socket 模块的使用。客户端发送字符串,服务端再将该字符串返回客户端,epoll中使用的边缘触发,刚刚学习python,可能还存在些问题,还请大家赐教。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP