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!")
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)
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")
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()
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