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图片验证码生成代码
Jul 02 Python
详解python的几种标准输出重定向方式
Aug 15 Python
Python虚拟环境virtualenv的安装与使用详解
May 28 Python
解决PyCharm中光标变粗的问题
Aug 05 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
Dec 20 Python
浅谈Django的缓存机制
Aug 23 Python
Python将8位的图片转为24位的图片实现方法
Oct 24 Python
用python求一个数组的和与平均值的实现方法
Jun 29 Python
python3 selenium自动化测试 强大的CSS定位方法
Aug 23 Python
python实现邮件循环自动发件功能
Sep 11 Python
如何在pycharm中安装第三方包
Oct 27 Python
Qt自定义Plot实现曲线绘制的详细过程
Nov 02 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学习笔记 [预定义数组(超全局数组)]
2011/06/09 PHP
php抽奖小程序的实现代码
2013/06/18 PHP
Yii CGridView用法实例详解
2016/07/12 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
php表单处理操作
2017/11/16 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
jquery制作漂亮的弹出层提示消息特效
2014/12/23 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
2015/07/29 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
JavaScript数组操作函数汇总
2016/08/05 Javascript
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
bootstrap中的 form表单属性role=&quot;form&quot;的作用详解
2017/01/20 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
2017/08/16 Javascript
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
实战node静态文件服务器的示例代码
2018/03/08 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
2018/06/19 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
2018/12/13 Javascript
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
利用Python爬虫给孩子起个好名字
2017/02/14 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
tensorflow TFRecords文件的生成和读取的方法
2018/02/06 Python
详解python字节码
2018/02/07 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
澳大利亚便宜隐形眼镜购买网站:QUICKLENS Australia
2018/10/06 全球购物
美国精油公司:Plant Therapy
2019/05/17 全球购物
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
机械设计及其自动化专业求职信
2014/06/09 职场文书
护林防火标语
2014/06/27 职场文书
新入职员工工作总结
2015/10/15 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
python 下划线的多种应用场景总结
2021/05/12 Python
教你怎么用Python生成九宫格照片
2021/05/20 Python