Example #1
0
    def _client_processor(self):
        logging.info("Client processor (selector) thread started!")
        self.server_socket.listen()
        self.server_socket.setblocking(False)
        self.sel.register(self.server_socket, selectors.EVENT_READ,
                          data=None)  #| selectors.EVENT_WRITE

        messaging.NotifierSock().bind((self.ip, self.port))

        while self.client_processor_thread_running.is_set():
            events = self.sel.select()
            #logging.error('tick')
            for key, mask in events:
                # logging.error(mask)
                # logging.error(str(key.data))
                client = key.data
                if client is None:
                    self._connect_client(key.fileobj)
                elif isinstance(client, messaging.ConnectionManager):
                    try:
                        client.process_events(mask)
                    except Exception as error:
                        logging.error(
                            "Exception {} occurred for {}! Resetting connection!"
                            .format(error, client.addr))
                        client.close(True)
                else:  # Notifier
                    client.process_events(mask)

        logging.info("Client autoconnect thread stopped!")
Example #2
0
    def _connect_client(self, sock):
        conn, addr = sock.accept()
        logging.info("Got connection from: {}".format(str(addr)))
        conn.setblocking(False)

        if addr[0] == self.ip and messaging.NotifierSock().addr is None:
            client = messaging.NotifierSock()
            logging.info("Notifier sock client")

        elif not any(
            [client_addr == addr[0] for client_addr in Client.clients.keys()]):
            client = Client(addr[0])
            logging.info("New client")
        else:
            client = Client.clients[addr[0]]
            logging.info("Reconnected client")
        self.sel.register(conn, selectors.EVENT_READ, data=client)
        client.connect(self.sel, conn, addr)
Example #3
0
    def stop(self):
        logging.info("Stopping server")

        self.client_processor_thread_running.clear()

        self.broadcast_thread_interrupt.set()
        self.broadcast_thread_running.clear()

        self.listener_thread_running.clear()

        messaging.NotifierSock().notify()

        self.server_socket.close()
        self.sel.close()

        messaging.NotifierSock().close()

        logging.info("Server stopped")
Example #4
0
    def start(self):
        logger.info("Starting client")
        messaging.NotifierSock().init(self.selector)

        try:
            while True:
                self._reconnect()
                self._process_connections()

        except (KeyboardInterrupt, ):
            logger.critical("Caught interrupt, exiting!")
            self.selector.close()
Example #5
0
    def _process_connections(self):
        while True:
            events = self.selector.select(timeout=1)
            # if time.time() - self._last_ping_time > 5:
            #    self.server_connection.send_message("ping")
            #    self._last_ping_time = time.time()
            # logging.debug("tick")

            for key, mask in events:
                connection = key.data
                if connection is None:
                    pass
                else:
                    try:
                        connection.process_events(mask)

                    except Exception as error:
                        logger.error(
                            "Exception {} occurred for {}! Resetting connection!"
                            .format(error, connection.addr))
                        self.server_connection._close()
                        self.connected = False

                        if isinstance(error, OSError):
                            if error.errno == errno.EINTR:
                                raise KeyboardInterrupt
            try:
                mapping_fds = self.selector.get_map().keys(
                )  # file descriptors
                notifier_fd = messaging.NotifierSock().get_sock().fileno()
            except (KeyError, RuntimeError) as e:
                logger.error(
                    "Exception {} occurred when getting connections map!".
                    format(e))
                logger.error(
                    "Connections changed during getting connections map, passing"
                )
            else:
                notify_only = len(
                    mapping_fds) == 1 and notifier_fd in mapping_fds
                if notify_only or not mapping_fds:
                    logger.warning("No active connections left!")
                    return