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的Django应用程序解决AJAX跨域访问问题的方法
May 31 Python
python 2.6.6升级到python 2.7.x版本的方法
Oct 09 Python
python的schedule定时任务模块二次封装方法
Feb 19 Python
彻底理解Python中的yield关键字
Apr 01 Python
Pandas操作CSV文件的读写实现方法
Nov 13 Python
基于Python词云分析政府工作报告关键词
Jun 02 Python
Python爬虫防封ip的一些技巧
Aug 06 Python
Python爬虫之Selenium设置元素等待的方法
Dec 04 Python
python办公自动化之excel的操作
May 23 Python
Python将CSV文件转化为HTML文件的操作方法
Jun 30 Python
Python多线程 Queue 模块常见用法
Jul 04 Python
python解析json数据
Apr 29 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 array_map array_multisort 高效处理多维数组排序
2009/06/11 PHP
Ajax+PHP 边学边练 之二 实例
2009/11/24 PHP
PHP备份/还原MySQL数据库的代码
2011/01/06 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
php无限遍历目录示例
2014/02/21 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
php查看网页源代码的方法
2015/03/13 PHP
php进程间通讯实例分析
2016/07/11 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
jquery 实现二级/三级/多级联动菜单的思路及代码
2013/04/08 Javascript
js如何获取file控件的完整路径具体实现代码
2013/05/15 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
js实现图片和链接文字同步切换特效的方法
2015/02/20 Javascript
JS实现选择TextArea内文本的方法
2015/08/03 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
JS中解决谷歌浏览器记住密码输入框颜色改变功能
2017/02/13 Javascript
jQuery树控件zTree使用方法详解(一)
2017/02/28 Javascript
轻松理解JavaScript闭包
2017/03/14 Javascript
深入理解Vue官方文档梳理之全局API
2017/11/22 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
[00:49]完美世界DOTA2联赛10月28日开团时刻:随便打
2020/10/29 DOTA
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
解决python中画图时x,y轴名称出现中文乱码的问题
2019/01/29 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
8款精美的CSS3表单设计(登录表单/下拉选择/按钮附演示及源码)
2013/02/04 HTML / CSS
给男朋友的道歉信
2014/01/12 职场文书
道路建设实施方案
2014/03/18 职场文书
领导欢迎词致辞
2015/01/23 职场文书
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android