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 Web框架Flask信号机制(signals)介绍
Jan 01 Python
python基于phantomjs实现导入图片
May 13 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 Python
Python探索之实现一个简单的HTTP服务器
Oct 28 Python
TensorFlow中权重的随机初始化的方法
Feb 11 Python
详解PyTorch批训练及优化器比较
Apr 28 Python
对python append 与浅拷贝的实例讲解
May 04 Python
说说如何遍历Python列表的方法示例
Feb 11 Python
Pytorch根据layers的name冻结训练方式
Jan 06 Python
K最近邻算法(KNN)---sklearn+python实现方式
Feb 24 Python
五分钟带你搞懂python 迭代器与生成器
Aug 30 Python
matplotlib之多边形选区(PolygonSelector)的使用
Feb 24 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 ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
PHP如何根据文件头检测文件类型实例代码
2018/10/14 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
2019/04/23 PHP
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
javascript function、指针及内置对象
2009/02/19 Javascript
IE6与IE7中,innerHTML获取param的区别
2009/03/15 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
JavaScript插件化开发教程(五)
2015/02/01 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
JavaScript中的ParseInt(&quot;08&quot;)和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
JavaScript实现无刷新上传预览图片功能
2017/08/02 Javascript
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
vue 导航内容设置选中状态样式的例子
2019/11/01 Javascript
linux 下以二进制的方式安装 nodejs
2020/02/12 NodeJs
javascript实现移动端上传图片功能
2020/08/18 Javascript
[48:27]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
Python中优化NumPy包使用性能的教程
2015/04/23 Python
深入浅析Python传值与传址
2018/07/10 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
Windows下python3安装tkinter的问题及解决方法
2020/01/06 Python
python Django 反向访问器的外键冲突解决
2020/05/20 Python
基于Python实现2种反转链表方法代码实例
2020/07/06 Python
纯css3实现宠物小鸡实例代码
2018/10/08 HTML / CSS
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
美国知名玩具品牌:Melissa & Doug
2016/08/16 全球购物
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
J2EE的优越性主要表现在哪些方面
2016/03/28 面试题
关于逃课的检讨书
2014/01/23 职场文书
年终晚会主持词
2014/03/25 职场文书
银行奉献演讲稿
2014/09/16 职场文书
vue3如何优雅的实现移动端登录注册模块
2021/03/29 Vue.js
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers