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中使用pngquant压缩png图片的教程
Apr 09 Python
介绍Python中的__future__模块
Apr 27 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
Jun 04 Python
Python实现朴素贝叶斯分类器的方法详解
Jul 04 Python
python输出100以内的质数与合数实例代码
Jul 08 Python
TensorFlow用expand_dim()来增加维度的方法
Jul 26 Python
OpenCV+python手势识别框架和实例讲解
Aug 03 Python
Ubuntu下Anaconda和Pycharm配置方法详解
Jun 14 Python
如何用Python做一个微信机器人自动拉群
Jul 03 Python
Python enumerate函数遍历数据对象组合过程解析
Dec 11 Python
Python验证码截取识别代码实例
May 16 Python
Python WSGI 规范简介
Apr 11 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
sae使用smarty模板的方法
2013/12/17 PHP
php隐藏IP地址后两位显示为星号的方法
2014/11/21 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
简单三步,搞掂内存泄漏
2007/03/10 Javascript
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
复选框全选与全不选操作实现思路
2013/08/18 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
JS替换字符串中字符即替换全部而不是第一个
2014/06/04 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
JS实现css hover操作的方法示例
2017/04/07 Javascript
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
解决Webpack 热部署检测不到文件变化的问题
2018/02/22 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
10分钟学会js处理json的常用方法
2020/12/06 Javascript
Python将多份excel表格整理成一份表格
2018/01/03 Python
Django 重写用户模型的实现
2019/07/29 Python
Python实现代码统计工具
2019/09/19 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
2020/01/25 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
东方红海科技面试题软件测试方面
2012/02/08 面试题
学生实习推荐信范文
2013/11/26 职场文书
同学会邀请书大全
2014/01/12 职场文书
社会学专业学生职业规划书
2014/02/07 职场文书
师德师风剖析材料
2014/09/30 职场文书
应急管理工作总结2015
2015/05/04 职场文书
毕业论文致谢部分怎么写
2015/05/14 职场文书
2016年小学生教师节广播稿
2015/12/18 职场文书
redis复制有可能碰到的问题汇总
2022/04/03 Redis
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers