#!/usr/bin/python
# -*- coding: utf-8 -*-
import socket
import Logger
import select
import sys
import getopt
def recv_epoll(s,logger):
data = ''
try:
while True:
buf = s.recv(65536)
if len(buf) == 0:
break
data += buf
logger.info("receiver data over")
finally:
return data
def send_epoll(s, data,logger):
try:
logger.info("begin send data")
while len(data) > 0:
byteswritten = s.send(data)
logger.debug("send %d data" %byteswritten)
data = data[byteswritten:]
logger.info("send data over")
finally:
return data
class EpollServer:
'''generic epoll server which accept connection from client socket'''
def __init__(self, port, logger):
"""init epoll
@param port : 端口
@param logger:对象"""
self.port = port
self.logger = logger
self.epoll = select.epoll()
def init_epoll(self):
""" initial epoll server socket"""
self.srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.srv.bind(('', self.port))
self.srv.listen(1)
self.srv.setblocking(0)
self.epoll.register(self.srv.fileno(), select.EPOLLIN | select.EPOLLET)
# 初始监测EPOLLIN事件
self.connections = {} # 存储fd的连接
self.requests = {} # 存储请求数据
self.responses = {} # 存储发送数据
def set_epoll(self, poll):
self.epoll.close()
self.epoll = poll
def accept_epoll(self):
"""建立连接"""
try:
while True:
connection, address = self.srv.accept()
connection.setblocking(0)
self.epoll.register(connection.fileno(), select.EPOLLIN | select.EPOLLHUP | select.EPOLLET)
self.connections[connection.fileno()] = connection
self.requests[connection.fileno()] = b''
self.responses[connection.fileno()] = b''
except socket.error:
pass
def do_operation(self, fileno):
"""从request中取数据,处理后放入response中"""
self.responses[fileno] = "DONE"
def do_request(self, fileno):
"""接受数据,保存入requests中,并调用do_operation操作处理其中的数据"""
self.requests[fileno] += recv_epoll(self.connections[fileno],self.logger)
self.do_operation(fileno)
self.epoll.modify(fileno, select.EPOLLOUT | select.EPOLLET)
def do_response(self, fileno):
"""将responses中的数据发送"""
self.logger.info("do response")
send_epoll(self.connections[fileno], self.responses[fileno],self.logger)
self.requests[fileno] = b''
self.epoll.modify(fileno, select.EPOLLHUP | select.EPOLLET)
def hup_epoll(self, fileno):
"""断开连接"""
self.logger.info("do hup_epoll")
self.epoll.unregister(fileno)
self.connections[fileno].close()
del self.connections[fileno]
del self.requests[fileno]
del self.responses[fileno]
def close_epoll(self):
self.epoll.unregister(self.srv.fileno())
self.srv.close()
self.epoll.close()
def do_epoll(self, fileno, event):
"""event 处理"""
try:
if fileno == self.srv.fileno():
self.accept_epoll() # 接受连接
elif event & select.EPOLLIN:
self.do_request(fileno) # 处理请求
elif event & select.EPOLLOUT:
self.do_response(fileno) # 回应
elif event & select.EPOLLHUP: # 结束
self.hup_epoll(fileno)
except:
raise
def loop_epoll(self):
try:
while True:
events = self.epoll.poll()
for fileno, event in events:
self.logger.debug("new epoll events from %d %s " %(fileno,event))
self.do_epoll(fileno, event)
finally:
self.close_epoll()
python_epoll_test.tar.gz_python 传递_python 服务器
版权申诉
73 浏览量
2022-09-14
20:28:51
上传
评论
收藏 5KB GZ 举报
APei
- 粉丝: 63
- 资源: 1万+
最新资源
- 蓝桥杯2024年第十五届省赛真题-前缀总分
- com.qihoo.appstore_300101305-1.apk
- tensorflow-gpu-2.7.1-cp37-cp37m-manylinux2010-x86-64.whl
- tensorflow-2.7.2-cp37-cp37m-manylinux2010-x86-64.whl
- tensorflow-2.7.1-cp39-cp39-manylinux2010-x86-64.whl
- 蓝桥杯2024年第十五届省赛真题-传送阵
- com.qihoo.appstore_300101305.apk
- linux之线程同步一.doc
- keil5配色方案10种
- python烟花代码.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈