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)
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)))