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实现的HTTP并发测试完整示例
Apr 23 Python
Python 实现文件的全备份和差异备份详解
Dec 27 Python
flask使用session保存登录状态及拦截未登录请求代码
Jan 19 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
Jun 04 Python
Python实现网站表单提交和模板
Jan 15 Python
python的mysql数据库建立表与插入数据操作示例
Sep 30 Python
详解python tkinter模块安装过程
Jan 06 Python
给Python学习者的文件读写指南(含基础与进阶)
Jan 29 Python
python实现人机五子棋
Mar 25 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 Python
Python修改DBF文件指定列
Dec 19 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 实例化类的一点摘记
2008/03/23 PHP
作为PHP程序员应该了解MongoDB的五件事
2013/06/03 PHP
PHP自动识别字符集并完成转码详解
2013/08/02 PHP
PHP使用内置dir类实现目录遍历删除
2015/03/31 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
2016/05/31 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
js 匿名调用实现代码
2009/06/19 Javascript
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
禁用Tab键JS代码兼容Firefox和IE
2014/04/18 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
Vue.js bootstrap前端实现分页和排序
2017/03/10 Javascript
jquery.flot.js简单绘制折线图用法示例
2017/03/13 Javascript
Vue AST源码解析第一篇
2017/07/19 Javascript
JS设计模式之惰性模式(二)
2017/09/29 Javascript
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
微信小程序中使用wxss加载图片并实现动画效果
2018/08/13 Javascript
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
Python中的默认参数实例分析
2018/01/29 Python
从0开始的Python学习016异常
2019/04/08 Python
python实现图片二值化及灰度处理方式
2019/12/07 Python
Pytoch之torchvision.transforms图像变换实例
2019/12/30 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
解决Keras 中加入lambda层无法正常载入模型问题
2020/06/16 Python
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
阿迪达斯新加坡官方网站:adidas新加坡
2019/12/06 全球购物
青年志愿者事迹材料
2014/02/07 职场文书
租房安全协议书
2014/08/20 职场文书
法定代表人证明书
2014/11/28 职场文书
贷款工作证明模板
2015/06/12 职场文书
护士医德医风心得体会
2016/01/25 职场文书
民事纠纷协议书
2016/03/23 职场文书
MySQL通过binlog恢复数据
2021/05/27 MySQL
深入详解JS函数的柯里化
2021/06/09 Javascript
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技