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 numpy 一维数组转变为多维数组的实例
Jul 02 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
Python的垃圾回收机制详解
Aug 28 Python
Python实现多线程/多进程的TCP服务器
Sep 03 Python
Python爬取知乎图片代码实现解析
Sep 17 Python
Python序列化与反序列化pickle用法实例
Nov 11 Python
python 多进程队列数据处理详解
Dec 23 Python
对tensorflow中的strides参数使用详解
Jan 04 Python
详解用Python进行时间序列预测的7种方法
Mar 13 Python
基于pycharm实现批量修改变量名
Jun 02 Python
python七种方法判断字符串是否包含子串
Aug 18 Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
Oct 29 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单例模式示例分享
2015/02/12 PHP
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
JS定时关闭窗口的实例
2013/05/22 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
2017/01/04 Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
2017/02/14 Javascript
async/await与promise(nodejs中的异步操作问题)
2017/03/03 NodeJs
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
微信小程序利用button控制条件标签的变量问题
2020/03/15 Javascript
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
浅析Python 中整型对象存储的位置
2016/05/16 Python
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
2018/12/20 Python
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
Python随机数函数代码实例解析
2020/02/09 Python
Python3将ipa包中的文件按大小排序
2020/04/17 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
伦敦最有品味的百货:Liberty London
2016/11/12 全球购物
联想新西兰官方网站:Lenovo New Zealand
2018/10/30 全球购物
戴森英国官网:Dyson英国
2019/05/07 全球购物
建筑项目策划书
2014/01/13 职场文书
校园创业策划书
2014/01/14 职场文书
情侣吵架检讨书
2014/02/05 职场文书
餐厅执行经理岗位职责范本
2014/02/26 职场文书
高中学校对照检查材料
2014/08/31 职场文书
2014年学校工作总结
2014/11/20 职场文书
给老师的感谢信
2015/01/20 职场文书
2015年出纳个人工作总结
2015/04/02 职场文书
免职通知
2015/04/23 职场文书
无工作证明怎么写
2015/06/15 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
Python爬虫实战之爬取携程评论
2021/06/02 Python
python turtle绘制多边形和跳跃和改变速度特效
2022/03/16 Python