def __connect(self): if self.hashkey < 0: self.hashkey = random.randint(0, len(self.ip) - 1) ip = self.ip[self.hashkey % len(self.ip)] try: sock = socket.create_connection((ip, self.port), self.cntmout) except socket.error, why: log.warning("connect error (%s)", why) return None
def thread_work(): head = nshead() pack = mcpack.dumps({"cmd":"test"}) for i in range(COUNT): head.log_id = 1234560000 + i head.body_len = len(pack) resp = cli.invite(head, pack) if not resp: log.warning("ub_client invite error") time.sleep(1) (h, body) = resp print mcpack.loads(body)
def __get_socket(self): self.sockcond.acquire() while len(self.sockets) == 0 and self.socket_num >= self.maxconn: self.sockcond.wait(1) if len(self.sockets) == 0: for i in range(self.retry): sock = self.__connect() if sock: break log.warning("connect failed, retry[%d]", i) if sock: self.socket_num += 1 else: sock = self.sockets.pop(0) self.sockcond.release() return sock
def invite(self, head, body, hashkey = -1): self.hashkey = hashkey sock = self.__get_socket() if not sock: log.warning("ub_client: connect to %s failed", self.name) return None rhead = None rbuf = None for i in range(self.retry): try: req = head.tobin() + body sock.settimeout(self.wrtmout) sock.sendall(req) sock.settimeout(self.rdtmout) rhead = nshead() rbuf = self.__recv(sock, rhead.size) if len(rbuf) == 0: raise socket.error("connection reset by peer") rhead.frombin(rbuf) rbuf = self.__recv(sock, rhead.body_len) if len(rbuf) != rhead.body_len: raise socket.error("recv body failed") break except socket.error, why: log.warning("socket error (%s), retry[%d]", why, i) sock.close() self.__put_socket(None) sock = self.__get_socket() if not sock: log.warning("ub_client: connect to %s failed", self.name) return None
def __consume(self, handler): pid = threading.current_thread().ident #print 'pid %d, consume read!' % pid conn = self.__get_conn() #print 'get conn, consume pid %d' % pid if not conn: return try: #print 'handle conn, pid %d' % pid handler.handle(conn) if self.server.conntype: self.__add_event(conn[0].fileno()) #conn[0].close() else: conn[0].close() except socket.error, why: log.warning("socket[%d] %s", conn[0].fileno(), why) conn[0].close()
return try: #print 'handle conn, pid %d' % pid handler.handle(conn) if self.server.conntype: self.__add_event(conn[0].fileno()) #conn[0].close() else: conn[0].close() except socket.error, why: log.warning("socket[%d] %s", conn[0].fileno(), why) conn[0].close() except Exception, why: stack_info = traceback.format_exc() log.warning("unknown error: %s", why) log.warning("stack info: \n%s", stack_info) def __main(self): log.init_thread() self.epoll = select.epoll() self.__add_event(self.server.listen_fd.fileno()) self.conn = {} while self.running: self.__produce() def __work(self):