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]