def __init__(self, socket, address):
        """
		服务抽象类
		"""
        if self.__class__ is Service:  # 抽象类不能实例化
            Logger.error("Net class dose not instantiation")
            raise Exception("Net class dose not instantiation")

        Service.server[address] = self

        self.address = address
        self.sock = socket
        self.switch = True
        self.isAlive = True
        self.pid = 0
        self.packQueue = []
        self.timeout = 30

        self.recvThread = None
        self.mainThread = None
        self.mainThreadName = None
        self.chkThread = None
        self.commCondition = None

        self.magicCode = None
        self.heartCode = None
        self.headerStruct = None
        self.headerSize = None

        self.packager = None
        self.terminalManager = None

        self.config(srvCenterConf)
        self.setPackager(Packager)
        self.setTerminalManager(TerminalManager)
 def chkHeart(self):
     while self.isAlive and self.switch:
         self.isAlive = False
         sleep(self.timeout)
     if self.switch:
         Logger.error("%s heart time out !" % self.address)
         self.shutdown()
	def chkResponse(self):
		self.chkCondition.acquire()
		while self.switch:
			while self.respSurplusTime>0 and self.switch:
				sleep( self.timeout )
				self.respSurplusTime -= self.timeout
			if self.respWaitCount > 0:
				Logger.error('%s response time out ! %d'%(self.address, self.respWaitCount))
				self.shutdown()
			else:
				self.chkCondition.wait()
		self.chkCondition.release()
	def parseHeader(self, stream):
		if len(stream) >= self.headerSize:
			head = unpack(self.headerStruct, stream[ : self.headerSize])
			if head[1] != self.magicCode:
				Logger.error('receive invalid package from Server : ', stream)
				self.shutdown()
			if head[0] + 2 <= len(stream):
				mStream = stream[self.headerSize : head[0] + 2]
				stream = stream[head[0] + 2 : ]
				if head[2] != self.heartCode:
					self.packQueue( head[3], head[2], mStream )
				stream = self.parseHeader(stream)
		return stream
	def recv(self):
		sourceStream = ''
		while self.switch:
			recvStream = self.sock.recv( 1000 )
			Logger.debug( 'receive raw stream from Server : ', recvStream )
			if recvStream:
				sourceStream = self.parseHeader( '%s%s' % ( sourceStream, recvStream ) )
			else:
				Logger.error( 'disconnect!' )
				DB.stop()
				self.sock.shutdown( socket.SHUT_RDWR )
				self.sock.close()
				self.switch = False
 def receive(self):
     try:
         sourceStream = ""
         while self.switch:
             Logger.debug("%s receiving..." % self.address)
             recvStream = self.sock.recv(1000)
             Logger.debug("receive raw stream from %s : " % self.address, recvStream)
             if recvStream:
                 self.isAlive = True
                 sourceStream = self.parseHeader("%s%s" % (sourceStream, recvStream))
             elif self.switch == True:
                 Logger.info("%s disconnect..." % self.address)
                 self.shutdown()
     except:
         Logger.error("%s receive error : \n%s" % (self.address, format_exc()))
         self.shutdown()
 def parseHeader(self, stream):
     if len(stream) >= self.headerSize:
         head = unpack(self.headerStruct, stream[: self.headerSize])
         if head[1] != self.magicCode:
             Logger.error("receive invalid package from %s : " % self.address, stream)
             self.shutdown()
         if head[0] + 2 <= len(stream):
             mStream = stream[self.headerSize : head[0] + 2]
             stream = stream[head[0] + 2 :]
             if head[2] != self.heartCode:
                 self.commCondition.acquire()
                 self.packQueue.insert(0, [head[3], head[2], mStream])
                 self.commCondition.notify()
                 self.commCondition.release()
             stream = self.parseHeader(stream)
     return stream
 def shutdown(self):
     Logger.error("%s shutdown !" % self.address)
     self.switch = False
     self.sock.shutdown(SHUT_RDWR)
     self.sock.close()
     del Service.server[self.address]