def __init__(self, remote_address, local_address, aware, ssl_crt_file_path, needSsl=True): self.client = None self.needSsl = needSsl self.remote_address = remote_address self.local_address = local_address self.ssl_crt_file_path = ssl_crt_file_path self.inputs = [] self.outputs = [] self.aware = aware self.input_executor = ThreadPoolExecutor( max_workers=rpc_handle_max_workers) self.terminal = JsonRpcTerminal(self.client, self.remote_address, self.input_executor) self.terminal.start_req_timeout() self.shutdown = True self.lock = thread.allocate_lock()
class JsonRpcClient(): def __init__(self, remote_address, local_address, aware, ssl_crt_file_path, needSsl=True): self.client = None self.needSsl = needSsl self.remote_address = remote_address self.local_address = local_address self.ssl_crt_file_path = ssl_crt_file_path self.inputs = [] self.outputs = [] self.aware = aware self.input_executor = ThreadPoolExecutor( max_workers=rpc_handle_max_workers) self.terminal = JsonRpcTerminal(self.client, self.remote_address, self.input_executor) self.terminal.start_req_timeout() self.shutdown = True self.lock = thread.allocate_lock() def start(self): curr_thread = threading.currentThread() curr_thread.setName("JsonRpcClient") while not self.inputs is None: if self.shutdown: logger.debug("rpc client shutdown") # self.terminal._shutdown() break readable, writable, exceptional = select.select(self.inputs, self.outputs, self.inputs, 1) if not (readable or writable or exceptional): continue for s in readable: tm = self.terminal if tm._read() == -1: self.close() for s in exceptional: logger.error("rpc client connection exception, remove " "connection %s", s.getpeername()) self.close() def get_terminal(self): if self._is_terminal_work(): return self.terminal else: raise NoTerminalFromIpException() def _is_terminal_work(self): return self.terminal.connection is not None or self.shutdown is False def has_terminal(self): return self._is_terminal_work() def connect(self): with self.lock: self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if self.needSsl: self.client = self._sslWrap(self.client) if self.local_address: logger.debug("json_rpc_client: bind address: %s", self.local_address) self.client.bind(self.local_address) self.client.settimeout(socket_timeout) self.client.connect(self.remote_address) self.client.settimeout(None) self.inputs.append(self.client) self.terminal.connection = self.client self.aware.added(self.terminal) self.shutdown = False def _sslWrap(self, socket): return ssl.wrap_socket(socket, cert_reqs=ssl.CERT_NONE, ssl_version=PROTOCOL_TLSv1) def close(self): with self.lock: logger.debug("json_rpc_client: close client") if self.client: if self.client in self.inputs: self.inputs.remove(self.client) try: self.client.close() except socket.error, e: logger.error("close socket error,ip=%s", self.remote_address) logger.error(e) self.terminal.connection = None self.terminal.pre_buffer = [] self.shutdown = True self.aware.removed(self.terminal)