Exemplo n.º 1
0
 def __remove_subscriber(self, subs: SubscriberConnection):
     self._subscribers.remove(subs)
     if subs.info:
         logging.info('Bye registered user: {0}, connections: {1}'.format(
             subs.info.email, len(self._subscribers)))
     else:
         logging.info(
             'Closed connection address: {0}, connections: {1}'.format(
                 subs.address(), len(self._subscribers)))
Exemplo n.º 2
0
    def refresh(self):
        while not self._stop_listen:
            rsockets = []
            rsockets.append(self._subscribers_server_socket)
            for client in self._subscribers:
                rsockets.append(client.socket())
            for server in self._servers_pool:
                if server.is_connected():
                    rsockets.append(server.socket())

            readable, writeable, _ = gsocket.Select(rsockets, [], [], 1)
            for read in readable:
                # income subscriber connection
                if self._subscribers_server_socket == read:
                    csock, addr = read.accept()
                    subs = SubscriberConnection(csock, addr, self)
                    self.__add_maybe_subscriber(subs)
                    continue

                # subscriber read
                for client in self._subscribers:
                    if client.socket() == read:
                        res = client.recv_data()
                        if not res:
                            self.__close_subscriber(client)
                        break

                for server in self._servers_pool:
                    if server.socket() == read:
                        server.recv_data()
                        break

            ts_sec = make_utc_timestamp() / 1000
            copy_subsc = list(self._subscribers)
            for client in copy_subsc:
                if ts_sec - client.last_ping_ts > SubscribersServiceManager.PING_SUBSCRIBERS_SEC:
                    if client.is_active():
                        result = client.ping(client.gen_request_id())
                        if result:
                            client.last_ping_ts = ts_sec
                        else:
                            self.__close_subscriber(client)
Exemplo n.º 3
0
 def __add_maybe_subscriber(self, subs: SubscriberConnection):
     self._subscribers.append(subs)
     logging.info('New connection address: {0}, connections: {1}'.format(
         subs.address(), len(self._subscribers)))
Exemplo n.º 4
0
 def __close_subscriber(self, subs: SubscriberConnection):
     self.__remove_subscriber(subs)
     subs.disconnect()