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通过pil将图片转换成黑白效果的方法
Mar 16 Python
浅谈Python中列表生成式和生成器的区别
Aug 03 Python
Python中import导入上一级目录模块及循环import问题的解决
Jun 04 Python
深入理解 Python 中的多线程 新手必看
Nov 20 Python
基于并发服务器几种实现方法(总结)
Dec 29 Python
Python离线安装PIL 模块的方法
Jan 08 Python
python使用turtle绘制国际象棋棋盘
May 23 Python
python自动化之Ansible的安装教程
Jun 13 Python
Python用Try语句捕获异常的实例方法
Jun 26 Python
Python partial函数原理及用法解析
Dec 11 Python
TensorFlow命名空间和TensorBoard图节点实例
Jan 23 Python
Python Map 函数的使用
Aug 28 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 变量的定义方法
2010/01/26 PHP
PHP判断指定时间段的2个方法
2014/03/14 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
新鲜出炉的js tips提示效果
2011/04/03 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
JS实现slide文字框缩放伸展效果代码
2015/11/05 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
在antd Table中插入可编辑的单元格实例
2020/10/28 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
Python创建日历实例
2014/08/21 Python
Python深入学习之特殊方法与多范式
2014/08/31 Python
Python字符编码判断方法分析
2016/07/01 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
利用python获取Ping结果示例代码
2017/07/06 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
Python龙贝格法求积分实例
2020/02/29 Python
CSS3为背景图设置遮罩并解决遮罩样式继承问题
2020/06/22 HTML / CSS
大学生求职简历的自我评价
2013/10/21 职场文书
数据管理员的自我评价分享
2013/11/15 职场文书
精彩的推荐信范文
2013/11/26 职场文书
小学生家长评语大全
2014/02/10 职场文书
结婚保证书范文
2014/04/29 职场文书
总经理人事任命书
2014/06/05 职场文书
道路运输企业安全生产责任书
2014/07/28 职场文书
2015年路政工作总结
2015/05/22 职场文书
党员证明模板
2015/06/19 职场文书
退休欢送会致辞
2015/07/31 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL
只用Python就可以制作的简单词云
2021/06/07 Python
pytorch中的 .view()函数的用法介绍
2022/03/17 Python
Python实现为PDF去除水印的示例代码
2022/04/03 Python