python使用epoll实现服务端的方法
作者:linux_c_coding_man 发布时间:2021-05-16 22:52:34
标签:python,epoll,服务端
如下所示:
#!/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
来源:https://blog.csdn.net/peng314899581/article/details/78066087


猜你喜欢
- 大家好,都说追女孩方法大于态度,学Python也是,今天就给大家分享的是我在用Python编写程序时常用的一些小技巧。1.多次打印同一个字符
- 本文实例为大家分享了vue实现登录拦截的具体代码,供大家参考,具体内容如下需求:用户只有登录了,用户名存储在本地储存时,才能进入首页,如果本
- numpy norm()函数求范数函数:norm(x, ord = None, axis = None, keepdims = False)
- 前言众所周知我们获取的第一手数据往往都是比较杂乱无章的,这些文件保存一般都是csv文件或者是excel文件,读取转换成DataFrame还有
- 可变参数可变参数应该最简单,在C/C++和Java等语言中都有,就是用*号来表示,例如def testArg(*arg)你可以传入任意多个元
- 本文实例讲述了Python实现的txt文件去重功能。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -*-#! pyt
- 在oracle中有很多关于日期的函数,如:1、add_months()用于从一个日期值增加或减少一些月份 date_value:=add_m
- call_user_func函数类似于一种特别的调用函数的方法,使用方法如下: function a($b,$c) { echo $b; e
- 本文默认你的开发环境.数据库已经安装好想用使用数据库.我们需要现在pom文件中添加相应的依赖pom.xml<?xml version=
- 1.python安装包下载路径:https://www.python.org/downloads/2我下载安装包路径:https://www
- 原理:第一步:应用程序把查询SQL语句发给服务器端执行。我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给
- 今天同学向我提了一个问题,我觉得蛮有意思,现记录下来大家探讨下。问题是:在一个表里面,有一个允许为空的字段,空是可以重复的,但是不为空的值需
- 需求:Python实现三次密码验证,每次验证结果需要提示,三次验证不通过需要单独提示代码如下:user = '张无忌'pas
- 1、工厂模式在面向对象编程中,工厂模式是开发过程中最常用的设计模式之一,属于创建型模式,就是通过一个接口函数或对象来创建其他对象并返回,该模
- 这是一家游戏公司,他面试通过后 擅长的机试却没答出来,不过还是被录用了。这道题内容大概这样有条蛇它长度不固定,蛇头朝北顺时针盘旋着,请打印出
- 如何导入数据库 可以从限制文件中导入SQL共享服务器数据库。如果想把存放在其他地方的数据导入,需要先把其内容拷到限制文件中。(注:在导入数据
- 如何在安装setuptools模块时不生成egg压缩包而是源码 Q:如何在安装setuptools模块时
- 准备工作B站登录页 https://passport.bilibili.com/loginpython3pip install seleni
- 数字序号① ①② ②③ &
- 本篇文章记录一下函数的等高线及其三维图像的可视化方法。本例绘制的函数为:1. 网格点  在绘制曲线之前,