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 os模块中的isfile()和isdir()函数均返回false问题解决方法
Feb 04 Python
详解Python的Django框架中的通用视图
May 04 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
Jun 21 Python
Python基础语法(Python基础知识点)
Feb 28 Python
python 文件操作删除某行的实例
Sep 04 Python
深入浅析Python的类
Jun 22 Python
flask入门之表单的实现
Jul 18 Python
Python笔记之观察者模式
Nov 20 Python
python中tab键是什么意思
Jun 18 Python
Python提取视频中图片的示例(按帧、按秒)
Oct 22 Python
python 基于Apscheduler实现定时任务
Dec 15 Python
python 模块导入问题汇总
Feb 01 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
要会喝咖啡也要会知道咖啡豆
2021/03/03 咖啡文化
bindParam和bindValue的区别以及在Yii2中的使用详解
2018/03/12 PHP
PHP使用pdo实现事务处理操作示例
2018/09/05 PHP
PHP调用全国天气预报数据接口查询天气示例
2019/02/20 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
用 JavaScript 迁移目录
2006/12/18 Javascript
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
xml文档转换工具,附图表例子(hta)
2010/11/17 Javascript
JavaScript格式化数字的函数代码
2010/11/30 Javascript
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
用JavaScript计算在UTF-8下存储字符串占用字节数
2013/08/08 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
2013/11/30 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
bootstrapValidator自定验证方法写法
2016/12/01 Javascript
JSON对象转化为字符串详解
2017/08/11 Javascript
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
JavaScript 日期时间选择器一些小结
2018/04/02 Javascript
Vue.js 实现微信公众号菜单编辑器功能(一)
2018/05/08 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
Python去掉字符串中空格的方法
2014/03/11 Python
Python爬虫模拟登录带验证码网站
2016/01/22 Python
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
2017/12/14 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
Python Pexpect库的简单使用方法
2019/01/29 Python
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
2017/09/15 HTML / CSS
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
小学生新学期寄语
2014/01/19 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
公司转让协议书
2016/03/19 职场文书
辞职报告(范文三篇)
2019/08/27 职场文书