def recv_thread(self, channel_server_address, channel): def channel_message_received(command, payload): if command == 'connect': message = json.loads(payload) tx_channel = message['tx_channel'] rx_channel = message['rx_channel'] new_channel_server_address = message['channel_server_address'] s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) s.connect(self.__server_address) proxy = ChannelProxy(s, rx_channel, tx_channel, new_channel_server_address) proxy.start() with self.__lock: self.__channel_proxies.append(proxy) elif command == 'quit': return False return self.__running self.__pubsubsocket = PubSubSocket(channel_server_address) self.__pubsubsocket.recv(channel, channel_message_received) print 'recv_thread terminates.'
def run_main_loop( self ): # TODO: check channel proxies health, if not synchronized too long, should kill it. assert not self.__running self.__running = True try: self.__socket.listen(5) while self.__running: s, addr = self.__socket.accept() if not self.__running: break try: ret = apiclient.connect(conf.USER_NAME, conf.PASSWORD, self.__sensor_name) except Exception: traceback.print_exc() time.sleep(3.0) continue if ret: channel_server_address, channel, transfer_channel_server_address = ret rx_channel = 'rx-' + str(uuid.uuid4()) tx_channel = 'tx-' + str(uuid.uuid4()) proxy = ChannelProxy(s, rx_channel, tx_channel, transfer_channel_server_address) proxy.start() self.__proxies.append(proxy) s = PubSubSocket(channel_server_address) s.send( channel, 'connect', json.dumps({ 'tx_channel': rx_channel, 'rx_channel': tx_channel, 'channel_server_address': transfer_channel_server_address })) else: s.close() finally: print 'stopping channel proxies...' for p in self.__proxies: if p.running: p.stop() self.__proxies = []
def __init__(self, sock, rx_channel, tx_channel, channel_server_address): assert isinstance(sock, socket.socket) assert isinstance(rx_channel, (str, unicode)) assert isinstance(tx_channel, (str, unicode)) assert isinstance(channel_server_address, (str, unicode)) super(ChannelProxy, self).__init__() self.__socket = sock self.__rx_channel = rx_channel self.__tx_channel = tx_channel self.__pubsubsocket = PubSubSocket(channel_server_address) self.__running = False self.__socket_receiving_thread = None self.__channel_receiving_thread = None self.__lock = threading.Lock() self.__subscribed = False self.__other_ready = False self.__start_time = None