zoukankan      html  css  js  c++  java
  • python epoll方式tcp连接回发消息

    # -*- coding:utf-8 -*-
    import socket
    import select
    
    class testserver():
        def __init__(self):
            self.serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.serversocket.bind(('0.0.0.0', 8889))
            self.serversocket.listen(128)
            self.serversocket.setblocking(0)
    
        def run(self):
            response = "connecting status: 200"
            epoll = select.epoll()
            epoll.register(self.serversocket.fileno(), select.EPOLLIN)
    
            try:
                connections = {}
                requests = {}
                responses = {}
                endflag = '
    
    '
    
                while True:
                    events = epoll.poll(1)
                    for fid, event in events:
                        if fid == self.serversocket.fileno():
                            connection, address = self.serversocket.accept()
                            connection.setblocking(0)
                            epoll.register(connection.fileno(), select.EPOLLIN)
                            connections[connection.fileno()] = connection
                            requests[connection.fileno()] = ''
                            responses[connection.fileno()] = response.encode()
    
                        elif event & select.EPOLLIN:
                            try:
                                requests[fid] = connections[fid].recv(1024)
                                if len(str(requests[fid].decode())) == 0:
                                    connections[fid].shutdown(socket.SHUT_RDWR)
                                    break
                                else:
                                    print("2 | ------ : " + str(requests[fid].decode()) + "
    ")
                                    byteswritten = connections[fid].send(responses[fid])
    
                                if endflag in requests[fid]:
                                    epoll.modify(fid, select.EPOLLOUT)
                                    connections[fid].setsockopt(socket.IPPROTO_TCP, socket.TCP_CORK, 1)
                                    print('-' * 40 + '
    ' + requests[fid].decode()[:-2])
                            except:
                                continue
    
                        elif event & select.EPOLLOUT:
                            byteswritten = connections[fid].send(responses[fid])
                            responses[fid] = responses[fid][byteswritten:]
                            if len(responses[fid]) == 0:
                                connections[fid].setsockopt(socket.IPPROTO_TCP, socket.TCP_CORK, 0)
                                epoll.modify(fid, 0)
                                connections[fid].shutdown(socket.SHUT_RDWR)
    
                        elif event & select.EPOLLHUP:
                            epoll.unregister(fid)
                            connections[fid].close()
                            del connections[fid]
    
            except:
                print("server excepted ...")
                epoll.unregister(self.serversocket.fileno())
                self.run()
    
            finally:
                print("server closed ...")
    
    
    if __name__ == "__main__":
        serv = testserver()
        serv.run()
  • 相关阅读:
    类的嵌套
    一种设计模式--单例模式
    python中的类(二)
    Python中的类(一)
    基于session和cookie的登录验证(CBV模式)
    Django中的CBV和FBV
    python3 装饰器
    cookie和session
    基于cookie和session的登录验证
    python3 安装win32api
  • 原文地址:https://www.cnblogs.com/6min/p/10764102.html
Copyright © 2011-2022 走看看