Exemplo n.º 1
0
 def __init__(self, event_loop, server_addr):
     self._event_loop = event_loop 
     self._connector = ZTcpConnector(self._event_loop, server_addr)
     self._connection_callback = self._default_connection_callback 
     self._connection_error_callback = self._default_connection_error_callback 
     self._message_callback = self._default_message_callback
     self._retry = False
     self._connect = True
     self._next_conn_id = 1
     self._connection = None
     self._guard = Condition(Lock())
     self._connector.set_new_connection_callback(self._new_connection)
Exemplo n.º 2
0
class ZTcpClient(object):
    def __init__(self, event_loop, server_addr):
        self._event_loop = event_loop 
        self._connector = ZTcpConnector(self._event_loop, server_addr)
        self._connection_callback = self._default_connection_callback 
        self._connection_error_callback = self._default_connection_error_callback 
        self._message_callback = self._default_message_callback
        self._retry = False
        self._connect = True
        self._next_conn_id = 1
        self._connection = None
        self._guard = Condition(Lock())
        self._connector.set_new_connection_callback(self._new_connection)

    def connect(self):
        server_addr = self._connector.server_addr()
        logging.info('ZTcpClient.connect connecting to %s_%d' %(server_addr[0], server_addr[1]))
        self._connect = True
        self._connector.set_connect_error_callback(self._connection_error_callback)
        self._connector.start()

    def disconnect(self):
        self._connect = False
        with self._guard:
            if self._connection:
                self._connection.shutdown_write()

    def stop(self):
        self._connect = False
        self._connector.stop()

    def get_event_loop(self):
        return self._event_loop

    def retry(self):
        pass

    def enable_retry(self):
        self._retry = True

    def set_connection_callback(self, cb):
        self._connection_callback = cb

    def set_connection_error_callback(self, cb):
        self._connection_error_callback = cb

    def set_message_callback(self, cb):
        self._message_callback = cb

    def set_write_complete_callback(self, cb):
        self._write_complete_callack = cb

    def _new_connection(self, sock):
        self._event_loop.assert_in_loop_thread()
        local_addr = sock.getsockname()
        server_addr = self._connector.server_addr()
        conn_name = '%s_%d:%s_%d' %(local_addr[0], local_addr[1], server_addr[0], server_addr[1])
        logging.info('ZTcpClient._new_conection connect successfully %s' %(conn_name))
        tcp_conn = ZTcpConnection(self._event_loop, conn_name, sock, server_addr) 
        tcp_conn.set_connection_callback(self._connection_callback)
        tcp_conn.set_message_callback(self._message_callback)
        tcp_conn.set_close_callback(self._remove_connection)

        with self._guard:
            self._connection = tcp_conn

        tcp_conn.connection_established()

    def _remove_connection(self, conn):
        self._event_loop.assert_in_loop_thread()
        assert self._event_loop == conn.get_event_loop()
        with self._guard:
            assert self._connection == conn
            self._connection = None

        self._event_loop.queue_in_loop(conn.connection_destroyed)
        if self._retry and self._connect:
            server_addr = self._connector.server_addr()
            logging.info('ZTcpClient._remove_connection reconnecting to %s_%d' %(server_addr[0], server_addr[1]))
            self._connector.restart()

    def _default_connection_error_callback(self, server_addr, errno):
        logging.info('failed to connect to (%s), errno=(%d)' %(str(server_addr), errno))

    def _default_connection_callback(self, tcp_conn):
        logging.info('%s is %s' %(tcp_conn.name(), tcp_conn.connected() and 'UP' or 'DOWN'))

    def _default_message_callback(self, tcp_conn, buf, receive_time):
        import time
        data = buf.retrieve_all_as_string()
        logging.info('receive data: %s at %s' %(data, time.ctime(receive_time)))