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开发中要注意的十个小贴士
Aug 30 Python
Python中序列的修改、散列与切片详解
Aug 27 Python
深入浅析Python传值与传址
Jul 10 Python
对Python中内置异常层次结构详解
Oct 18 Python
pandas求两个表格不相交的集合方法
Dec 08 Python
用Python实现校园通知更新提醒功能
Nov 23 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
Jan 15 Python
python实现录屏功能(亲测好用)
Mar 02 Python
Python json读写方式和字典相互转化
Apr 18 Python
Python基于staticmethod装饰器标示静态方法
Oct 17 Python
浅谈Selenium 控制浏览器的常用方法
Dec 04 Python
Python爬虫自动化爬取b站实时弹幕实例方法
Jan 26 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 面向对象(学习记录)
2009/12/02 PHP
php判断是否为json格式的方法
2014/03/04 PHP
php+mysql实现简单的增删改查功能
2015/07/13 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
两种php去除二维数组的重复项方法
2015/11/04 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
jQuery 入门讲解1
2009/04/15 Javascript
jquery提示 &quot;object expected&quot;的解决方法
2009/12/13 Javascript
jquery 读取页面load get post ajax 四种方式代码写法
2011/04/02 Javascript
Jquery下:nth-child(an+b)的使用注意
2011/05/28 Javascript
JS打开图片另存为对话框实现代码
2012/12/26 Javascript
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
vue生命周期实例小结
2018/08/15 Javascript
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
微信小程序公用参数与公用方法用法示例
2019/01/09 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
vue使用swiper.js重叠轮播组建样式
2019/11/14 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
Python深入学习之装饰器
2014/08/31 Python
Python中的生成器和yield详细介绍
2015/01/09 Python
TensorFlow实现卷积神经网络CNN
2018/03/09 Python
django模板加载静态文件的方法步骤
2019/03/01 Python
Python 求数组局部最大值的实例
2019/11/26 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
序列化Python对象的方法
2020/08/01 Python
尼克松手表官网:Nixon手表
2019/03/17 全球购物
自我评价的范文
2014/02/02 职场文书
上班迟到检讨书300字
2014/10/18 职场文书
创业计划书之酒吧
2019/12/02 职场文书
Java 使用类型为Object的变量指向任意类型的对象
2022/04/13 Java/Android
css3 选择器
2022/05/11 HTML / CSS