python使用epoll实现服务端的方法


Posted in Python onOctober 16, 2018

如下所示:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import socket
import select

send_data = "hello world!"
send_len = len(send_data)
recv_len = 1024
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
addr = ("0.0.0.0", 8765)
tcp_socket.bind(addr)
tcp_socket.listen(5)
tcp_socket.setblocking(False)
epoll = select.epoll()
'''(边缘触发)select.EPOLLIN | select.EPOLLET'''
epoll.register(tcp_socket.fileno(), select.EPOLLIN)
'''因为epoll返回的触发事件对应的是套接字文件描述符,所以需要在字典中加入对应关系'''
fd_to_socket = {tcp_socket.fileno():tcp_socket}

while True :
 events = epoll.poll(-1)
 for fd, event in events:
  fd_socket = fd_to_socket[fd]
  if fd == tcp_socket.fileno():
   while True:
    try:
     new_socket, new_addr = fd_socket.accept()
    except socket.error as e:
     (errno, err_msg) = e
     print errno
     print err_msg
     if errno == 11:
      break
    print "new accpet:", new_addr
    new_socket.setblocking(False)
    new_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
    epoll.register(new_socket.fileno(), select.EPOLLIN)
    fd_to_socket[new_socket.fileno()] = new_socket
  elif event&select.EPOLLIN:
   recv_datas = []
   recd = 0
   while (recd < recv_len):
    try:
     recv_data = fd_socket.recv(recv_len - recd)
     '''处理读的正常关闭'''
     if recv_data == "":
      print "close socket"
      epoll.unregister(fd)
      fd_to_socket[fd].close()
      del fd_to_socket[fd]
      break
     else:
      recv_datas.append(recv_data)
      recd = recd + len(recv_data)
    '''处理异常关闭(EAGAIN,EINTR)'''
    except socket.error as e:
     (errno, err_msg) = e
     print errno
     print err_msg
     '''因为用的水平触发,EAGAIN我们跳出循环,等待下次触发再读就好了'''
     if errno == 11:
      break
     '''软中断打断了还要继续读'''
     elif errno == 4:
      continue
     '''其它错误我们直接关闭套接字'''
     else:
      print "close socket"
      epoll.unregister(fd)
      fd_to_socket[fd].close()
      del fd_to_socket[fd]
      break
    print repr(recv_datas)
    total_send = 0
    while total_send < send_len:
     sent = fd_socket.send(send_data[total_send:])
     if sent == 0:
      print "close socket"
      epoll.unregister(fd)
      fd_to_socket[fd].close()
      del fd_to_socket[fd]
      break
     else:
      print repr(send_data[total_send:])
      total_send = total_send + sent

其实这里的异常处理我们也可以用

except IOError as e:
  print e.errno
  print e.strerror

以上这篇python使用epoll实现服务端的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
pyside写ui界面入门示例
Jan 22 Python
python批量同步web服务器代码核心程序
Sep 01 Python
python 采集中文乱码问题的完美解决方法
Sep 27 Python
python实现隐马尔科夫模型HMM
Mar 25 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
python 对多个csv文件分别进行处理的方法
Jan 07 Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 Python
Python分析彩票记录并预测中奖号码过程详解
Jul 09 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
Aug 30 Python
python中id函数运行方式
Jul 03 Python
python实现简单的聊天小程序
Jul 07 Python
Python函数式编程中itertools模块详解
Sep 15 Python
Python 访问限制 private public的详细介绍
Oct 16 #Python
对django中render()与render_to_response()的区别详解
Oct 16 #Python
浅谈django的render函数的参数问题
Oct 16 #Python
django之跨表查询及添加记录的示例代码
Oct 16 #Python
python看某个模块的版本方法
Oct 16 #Python
对python中的 os.mkdir和os.mkdirs详解
Oct 16 #Python
详解Django的model查询操作与查询性能优化
Oct 16 #Python
You might like
php5数字型字符串加解密代码
2008/04/24 PHP
php遍历数组的方法分享
2012/03/22 PHP
php中实现精确设置session过期时间的方法
2014/07/17 PHP
JavaScript prototype属性使用说明
2010/05/13 Javascript
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
Javascript中产生固定结果的函数优化技巧
2013/01/16 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
使用js如何实现全选与全不选
2013/12/30 Javascript
jquery用data方法获取某个元素上的事件
2014/06/23 Javascript
深入浅出分析javaScript中this用法
2015/05/09 Javascript
干货分享:让你分分钟学会javascript闭包
2015/12/25 Javascript
js脚本编写简单刷票投票系统
2017/06/27 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
2018/03/03 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
2020/05/13 Javascript
[43:43]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第一场 11.22
2020/11/24 DOTA
Python三元运算实现方法
2015/01/12 Python
用Python代码来绘制彭罗斯点阵的教程
2015/04/03 Python
python 列表递归求和、计数、求最大元素的实例
2018/11/28 Python
Python 迭代,for...in遍历,迭代原理与应用示例
2019/10/12 Python
Python多线程实现支付模拟请求过程解析
2020/04/21 Python
Python Scrapy多页数据爬取实现过程解析
2020/06/12 Python
在keras中model.fit_generator()和model.fit()的区别说明
2020/06/17 Python
详细分析Python可变对象和不可变对象
2020/07/09 Python
python 如何调用远程接口
2020/09/11 Python
简单了解Python字典copy与赋值的区别
2020/09/16 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
2021/01/27 Python
墨西哥巴士车票在线购买:ClickBus
2018/03/27 全球购物
电气工程自动化求职信
2014/03/14 职场文书
中餐厅经理岗位职责
2014/04/11 职场文书
领导班子作风建设年个人整改措施
2014/09/29 职场文书
杜甫草堂导游词
2015/02/03 职场文书
安阳殷墟导游词
2015/02/10 职场文书
村党组织公开承诺书
2015/04/30 职场文书
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript