• 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()
  • 相关阅读:
    React组件的生命周期
    React页面路由
    元空间和直接内存
    类加载问题
    GC调优与jvm参数问题
    常用限流策略——漏桶与令牌桶介绍
    sqlx库使用
    Go操作MySQL
    swagger生成接口文档
    Go性能调优
  • 原文地址:https://www.cnblogs.com/6min/p/10764102.html
Copyright © 2020-2023  润新知