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查找第k小元素代码分享
Dec 18 Python
python使用cPickle模块序列化实例
Sep 25 Python
Python利用matplotlib生成图片背景及图例透明的效果
Apr 27 Python
python Crypto模块的安装与使用方法
Dec 21 Python
Python爬虫实现百度图片自动下载
Feb 04 Python
Python入门之后再看点什么好?
Mar 05 Python
用Python逐行分析文件方法
Jan 28 Python
python实现五子棋小程序
Jun 18 Python
pycharm访问mysql数据库的方法步骤
Jun 18 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
Oct 12 Python
如何在django中添加日志功能
Feb 06 Python
Python读取xlsx数据生成图标代码实例
Aug 12 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
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
php使用类继承解决代码重复的问题
2015/02/11 PHP
PHP编译安装时常见错误解决办法
2015/05/28 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
PHP切割汉字的常用方法实例总结
2019/04/27 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
2020/05/02 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
数理公式,也可以这么唯美
2021/03/10 无线电
js tab 选项卡
2009/04/26 Javascript
javascript实现动态导入js与css等静态资源文件的方法
2015/07/25 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
2015/11/17 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
js转换对象为xml
2017/02/17 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
Cpage.js给组件绑定事件的实现代码
2017/08/31 Javascript
jQuery EasyUI 选项卡面板tabs的使用实例讲解
2017/12/25 jQuery
Node登录权限验证token验证实现的方法示例
2020/05/25 Javascript
Python之文字转图片方法
2018/05/10 Python
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
Python常用爬虫代码总结方便查询
2019/02/25 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
快速了解Python开发环境Spyder
2020/06/29 Python
CSS3制作日历实现代码
2012/01/21 HTML / CSS
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
2016/03/14 HTML / CSS
美国排名第一的在线葡萄酒商店:Wine.com
2016/09/07 全球购物
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
英国计算机商店:Technextday
2019/12/28 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
天网工程实施方案
2014/03/26 职场文书
《春天来了》教学反思
2014/04/07 职场文书
投资合作协议书
2014/04/17 职场文书
党员干部反四风民主生活会对照检查材料思想汇报
2014/10/12 职场文书
2016年暑期见闻作文
2015/11/25 职场文书
销区经理年终述职报告模板
2019/11/28 职场文书
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang
SpringBoot2零基础到精通之数据与页面响应
2022/03/22 Java/Android