예제 #1
0
	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
예제 #2
0
파일: test.py 프로젝트: chansonZ/xiaoju
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)
예제 #3
0
	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
예제 #4
0
	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
예제 #5
0
	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()
예제 #6
0
			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):