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中logging模块的用法实例
Sep 29 Python
Python MySQLdb Linux下安装笔记
May 09 Python
Python获取运行目录与当前脚本目录的方法
Jun 01 Python
Python操作mysql数据库实现增删查改功能的方法
Jan 15 Python
Python KMeans聚类问题分析
Feb 23 Python
python开发之anaconda以及win7下安装gensim的方法
Jul 05 Python
PyQt5通信机制 信号与槽详解
Aug 07 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
Aug 07 Python
python关于变量名的基础知识点
Mar 03 Python
django处理select下拉表单实例(从model到前端到post到form)
Mar 13 Python
python 使用多线程创建一个Buffer缓存器的实现思路
Jul 02 Python
python super()函数的基本使用
Sep 10 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
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
深入apache host的配置详解
2013/06/09 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
深入认识JavaScript中的函数
2007/01/22 Javascript
javascript TextArea动态显示剩余字符
2008/10/22 Javascript
用JavaScript编写COM组件的步骤
2009/03/17 Javascript
JS定义回车事件(实现代码)
2013/07/08 Javascript
JS实现让访问者自助选择网页文字颜色的方法
2015/02/24 Javascript
javaScript基础语法介绍
2015/02/28 Javascript
JQuery页面地址处理插件jqURL详解
2015/05/03 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
js表单登陆验证示例
2016/10/19 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
redux-saga 初识和使用
2018/03/10 Javascript
微信小程序实现倒计时补零功能
2018/07/09 Javascript
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
[01:14]DOTA2 7.22版本新增神杖效果展示(智力英雄篇)
2019/05/29 DOTA
python中实现定制类的特殊方法总结
2014/09/28 Python
Python搜索引擎实现原理和方法
2017/11/27 Python
快速了解Python中的装饰器
2018/01/11 Python
python数据结构之线性表的顺序存储结构
2018/09/28 Python
10款最好的Python开发编辑器
2019/07/03 Python
Python函数生成器原理及使用详解
2020/03/12 Python
最新pycharm安装教程
2020/11/18 Python
Python基于template实现字符串替换
2020/11/27 Python
HTML5之SVG 2D入门4—笔画与填充
2013/01/30 HTML / CSS
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
加拿大女包品牌:Matt & Nat
2017/05/12 全球购物
雅诗兰黛旗下专业男士保养领导品牌:Lab Series
2017/05/15 全球购物
新锐科技Java程序员面试题
2016/07/25 面试题
职业生涯规划书的格式
2013/12/29 职场文书
西门豹教学反思
2014/02/04 职场文书
外国人来华邀请函
2015/01/31 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
Go Plugins插件的实现方式
2021/08/07 Golang
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技