Example #1
0
    def __init__(self, port=8885, address='', client_cls=SimpleClient):
        Thread.__init__(self)
        self.client_cls = client_cls
        self.port = port
        self.socket = self.create_socket(port, address)
        self.fileno = self.socket.fileno()

        self.epoll = select.epoll()
        self.epoll_register(self.socket)

        self.clients = ClientsMap()
Example #2
0
class BaseHandler(Common, Thread):

    epoll_timeout = 2

    def __init__(self, port=8885, address='', client_cls=SimpleClient):
        Thread.__init__(self)
        self.client_cls = client_cls
        self.port = port
        self.socket = self.create_socket(port, address)
        self.fileno = self.socket.fileno()

        self.epoll = select.epoll()
        self.epoll_register(self.socket)

        self.clients = ClientsMap()

    def create_socket(self, port, address):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        sock.bind((address, port))
        sock.listen(2)
        sock.setblocking(0)
        return sock

    def epoll_register(self, socket, type=select.EPOLLIN):
        self.epoll.register(socket.fileno(), type)

    def register(self, sock, address):
        self.clients[sock.fileno()] = sock
        self.epoll_register(sock, select.EPOLLIN)

    def modify(self, fileno, type):
        try:
            self.epoll.modify(fileno, type)
        except:
            logging.error('modify error', exc_info=True)

    def unregister(self, fileno):
        client = self.clients.get(fileno)
        if client:
            try:
                client.close()
                self.epoll.unregister(fileno)
            except:
                logging.error('unregister %s' % fileno, exc_info=True)
            del self.clients[fileno]

    def accept(self):
        sock, address = self.socket.accept()
        sock.setblocking(0)
        return self.register(sock, address)

    def run(self):
        while not self.epoll.closed:
            events = self.epoll.poll(self.epoll_timeout)
            for no, event in events:
                if no == self.fileno:
                    self.accept()
                else:
                    client = self.clients.get(no)
                    if client:
                        self.process(client, event)

    def stop(self):
        self.unregister(self.fileno)
        self.epoll.close()
        self.socket.close()