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 相关文章推荐
Python中Class类用法实例分析
Nov 12 Python
python3使用scrapy生成csv文件代码示例
Dec 28 Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 Python
pygame游戏之旅 添加游戏暂停功能
Nov 21 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
Sep 18 Python
python实现图片二值化及灰度处理方式
Dec 07 Python
python实现猜拳游戏
Mar 04 Python
解决jupyter notebook 前面书写后面内容消失的问题
Apr 13 Python
Python可以实现栈的结构吗
May 27 Python
Python函数__new__及__init__作用及区别解析
Aug 31 Python
python安装第三方库如xlrd的方法
Oct 31 Python
Pycharm连接远程服务器并远程调试的全过程
Jun 24 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
PHP 高手之路(三)
2006/10/09 PHP
php 删除cookie和浏览器重定向
2009/03/16 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
PHP的时间戳与具体时间转化的简单实现
2016/06/13 PHP
javascript实现原生ajax的几种方法介绍
2013/09/21 Javascript
实现前后端数据交互方法汇总
2015/04/07 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
基于JavaScript实现Tab选项卡切换效果
2016/11/24 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
angular中ui calendar的一些使用心得(推荐)
2017/11/03 Javascript
vue2.0 路由不显示router-view的解决方法
2018/03/06 Javascript
vue配置接口域名方法总结
2019/05/12 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
2020/09/22 Javascript
Python2.7读取PDF文件的方法示例
2017/07/13 Python
Python File readlines() 使用方法
2018/03/19 Python
使用Tensorboard工具查看Loss损失率
2020/02/15 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
2020/05/12 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
Python实现FTP文件定时自动下载的步骤
2020/12/19 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
CSS3 2D模拟实现摩天轮旋转效果
2016/11/16 HTML / CSS
Europcar英国:英国汽车和货车租赁
2017/01/21 全球购物
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
大学生涯自我鉴定
2014/01/16 职场文书
学校七一活动方案
2014/01/19 职场文书
创建卫生先进单位实施方案
2014/03/10 职场文书
应用数学专业求职信
2014/03/14 职场文书
课外活动总结范文
2014/07/09 职场文书
乡镇党委书记第三阶段个人整改措施
2014/09/16 职场文书
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
学校食堂管理制度
2015/08/04 职场文书