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 相关文章推荐
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
Jan 23 Python
python检测某个变量是否有定义的方法
May 20 Python
教你用Type Hint提高Python程序开发效率
Aug 08 Python
Python实现将文本生成二维码的方法示例
Jul 18 Python
python调用百度语音识别api
Aug 30 Python
python2.7 安装pip的方法步骤(管用)
May 05 Python
pytorch numpy list类型之间的相互转换实例
Aug 18 Python
python中的逆序遍历实例
Dec 25 Python
更新升级python和pip版本后不生效的问题解决
Apr 17 Python
Django 解决model 反向引用中的related_name问题
May 19 Python
五分钟带你搞懂python 迭代器与生成器
Aug 30 Python
Python中使用Selenium环境安装的方法步骤
Feb 22 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
thinkphp的c方法使用示例
2014/02/24 PHP
PHP读书笔记整理_结构语句详解
2016/07/01 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
2018/06/20 PHP
jQuery TextBox自动完成条
2009/07/22 Javascript
浅谈Javascript事件模拟
2012/06/27 Javascript
nodejs中exports与module.exports的区别详细介绍
2013/01/14 NodeJs
网站接入QQ登录的两种方法
2014/07/22 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
静态页面实现 include 引入公用代码的示例
2017/09/25 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
2018/01/07 Javascript
微信小程序之数据绑定原理解析
2019/08/14 Javascript
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
js实现跳一跳小游戏
2020/07/31 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
详细解析Python当中的数据类型和变量
2015/04/25 Python
python利用拉链法实现字典方法示例
2017/03/25 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
python 实现一次性在文件中写入多行的方法
2019/01/28 Python
Python基础之循环语句用法示例【for、while循环】
2019/03/23 Python
python 默认参数相关知识详解
2019/09/18 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
2020/11/30 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
python爬取股票最新数据并用excel绘制树状图的示例
2021/03/01 Python
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
保险专业大学生职业规划书
2014/03/03 职场文书
珍惜资源的建议书
2014/08/26 职场文书
毕业生评语大全
2015/01/04 职场文书
谢师宴答谢词
2015/01/05 职场文书
外出培训学习心得体会
2016/01/18 职场文书
工作违纪的检讨书范文
2019/07/09 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS