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 数据加密代码
Dec 24 Python
python使用pyhook监控键盘并实现切换歌曲的功能
Jul 18 Python
使用TensorFlow实现SVM
Sep 06 Python
详解django+django-celery+celery的整合实战
Mar 19 Python
Python定义函数功能与用法实例详解
Apr 08 Python
python__name__原理及用法详解
Nov 02 Python
Tensorflow中的dropout的使用方法
Mar 13 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
Apr 16 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
May 15 Python
python中round函数如何使用
Jun 19 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
Jan 05 Python
详解Python函数print用法
Jun 18 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
新版mysql+apache+php Linux安装指南
2006/10/09 PHP
PHP脚本的10个技巧(6)
2006/10/09 PHP
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
laravel5.5添加echarts实现画图功能的方法
2019/10/09 PHP
PHP的imageTtfText()函数深入详解
2021/03/03 PHP
写入cookie的JavaScript代码库 cookieLibrary.js
2009/10/24 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
jQuery使用deferreds串行多个ajax请求
2016/08/22 Javascript
JS中用三种方式实现导航菜单中的二级下拉菜单
2016/10/31 Javascript
JavaScript编写一个贪吃蛇游戏
2017/03/09 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
微信小程序有旋转动画效果的音乐组件实例代码
2018/08/22 Javascript
vue动态绑定class选中当前列表变色的方法示例
2018/12/19 Javascript
微信小程序实现收货地址左滑删除
2020/11/18 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
js中关于Blob对象的介绍与使用
2019/11/29 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
对numpy中shape的深入理解
2018/06/15 Python
python MNIST手写识别数据调用API的方法
2018/08/08 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
python实现递归查找某个路径下所有文件中的中文字符
2019/08/31 Python
浅谈Python type的使用
2019/11/19 Python
python删除指定列或多列单个或多个内容实例
2020/06/28 Python
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
大学毕业生通用自我评价
2014/01/05 职场文书
师德标兵事迹材料
2014/12/19 职场文书
仓库保管员岗位职责
2015/02/09 职场文书