def handleRequest(self): taskarg = ftsvr.getTaskRunArg() request = taskarg['data'] if not gdata.initializeOk(): ftlog.info('TYCommonHttpRequest not initialize ok, ignore this request :', request.path) request.setResponseCode(503) request.finish() return runhttp.handlerHttpRequest(request)
def handleRequest(self): taskarg = ftsvr.getTaskRunArg() request = taskarg['data'] if not gdata.initializeOk(): ftlog.info( 'TYCommonHttpRequest not initialize ok, ignore this request :', request.path) request.setResponseCode(503) request.finish() return runhttp.handlerHttpRequest(request)
def doSomeLogic(self): args = ftsvr.getTaskRunArg() src = args.get('src') dst = args.get('dst') userheader1 = args.get('userheader1') userheader2 = args.get('userheader2') msg = ftsvr.getTaskPack() # ftlog.debug('TYCommonS2AProto id=', id(self), 'src=', src, 'dst=', dst, 'h1=', userheader1, 'h2=', userheader2, 'pack=', msg) if not gdata.initializeOk(): ftlog.info('TYCommonS2AProto not initialize ok, ignore this message :', src, dst, userheader1, userheader2, msg) return runcmd.handlerCommand(msg)
def doSomeLogic(self): args = ftsvr.getTaskRunArg() src = args.get('src') dst = args.get('dst') userheader1 = args.get('userheader1') userheader2 = args.get('userheader2') msg = ftsvr.getTaskPack() # ftlog.debug('TYCommonS2AProto id=', id(self), 'src=', src, 'dst=', dst, 'h1=', userheader1, 'h2=', userheader2, 'pack=', msg) if not gdata.initializeOk(): ftlog.info( 'TYCommonS2AProto not initialize ok, ignore this message :', src, dst, userheader1, userheader2, msg) return runcmd.handlerCommand(msg)
def madeHandler(self): ''' TCP链接建立处理 ''' self.userId = 0 # 当前连接的UserId if not gdata.initializeOk(): ftlog.info( 'COTCPProto-madeHandler not initialize ok, close this TCP') self.closeConnection(1) return self.timeOutCount = 0 # 新连接的超时次数 self.heart_beat_count = 0 # 新连接的心跳次数 peer = self.transport.getPeer() self.clientAddress = str(peer.host) + ':' + str(peer.port) # 当前连接的地址 if not self in _NEW_PROTOCOLS: _NEW_PROTOCOLS[self] = self ftlog.info('TCP madeHandler', self.clientAddress)
def onTimer(): # 配置时间点执行 默认早晨7点 global _initing behaviourConf = dizhuconf.getUserBehaviourReward() if not behaviourConf or behaviourConf.get('open', 0) != 1: return if not gdata.initializeOk(): return try: executeTime = behaviourConf.get('executeTime', "6:05:00") executeTime = datetime.datetime.strptime(executeTime, "%H:%M:%S") if not _initing: if datetime.datetime.now().time() >= executeTime.time(): _initing = _getInfoFromTxt(behaviourConf) else: if datetime.datetime.now().time() < executeTime.time(): _initing = False except Exception, e: _initing = False ftlog.warn('dizhu_user_behaviour.onTimer.config err=', e.message) return
def doServerTcpMsg(self): ''' 其他服务发送至CONN服务的消息处理 绝大部分需要转发至用户客户端 ''' args = ftsvr.getTaskRunArg() src = args.get('src') dst = args.get('dst') userheader1 = args.get('userheader1') userheader2 = args.get('userheader2') msgstr = ftsvr.getTaskPack() cmd = strutil.getJsonStr(msgstr, 'cmd', '') ftlog.debug('COS2AProto-doServerTcpMsg src=', src, 'dst=', dst, 'h1=', userheader1, 'h2=', userheader2, 'cmd=', cmd, 'pack=', msgstr) if not gdata.initializeOk(): ftlog.info( 'COS2AProto-doServerTcpMsg not initialize ok, ignore this message :', ftsvr.getTaskPack()) return if userheader1 == 'S0': # 发送给用户客户端的消息标记 toUserId = int(userheader2) if toUserId in _ONLINE_USERS: user = _ONLINE_USERS[toUserId] if cmd == 'user_info': # 链接建立后, 第一个返回给客户端的命令必须是user_info isFirst = 0 if user.firstUserInfo == 0: isFirst = 1 user.sendTcpMessage(msgstr) user.firstUserInfo = 1 # 强制进行第一次心跳处理, 发送led,返回比赛报名情况等 if isFirst: msg = '{"cmd":"heart_beat","params":{"userId":%d,"gameId":%d,"clientId":"%s","must":1}}' % ( toUserId, user.gameId, user.clientId) router.sendUtilServer(msg, toUserId) if len(user.delaySendMsg) > 0: mlist = user.delaySendMsg user.delaySendMsg = [] for m in mlist: user.sendTcpMessage(m) else: # 只有第一个命令user_info完成后, 后续的消息才会发送给客户端 if user.firstUserInfo == 1: user.sendTcpMessage(msgstr) else: if user.delaySendMsg != None and len( user.delaySendMsg) < 20: user.delaySendMsg.append(msgstr) else: ftlog.info('ERROR, the user tcp bind not ok !', toUserId, cmd) else: ftlog.info('ERROR, the user is already offline !', toUserId, cmd) else: # 当前进程需要处理的消息, 例如更新配置,热更新,强制用户退出等 msg = MsgPack() try: msg.unpack(msgstr) except: raise Exception('the json data error 6 !! [' + repr(msgstr) + ']') task = FTTasklet.getCurrentFTTasklet() task.pack = msg task.run_args['pack'] = msg runcmd.handlerCommand(msg)
def doClientTcpMsg(self): """ 接收到一个的用户客户端的TCP消息 """ msgstr = ftsvr.getTaskPack() if not msgstr: return ftlog.debug('======== RECEIVE TCP->', self.clientAddress, 'pack=|', repr(msgstr), '|') msgstr = structProtocolHelper.decode(msgstr) if not gdata.initializeOk(): ftlog.warn( 'COTCPProto-doClientTcpMsg not initialize ok, ignore this message :', msgstr) return if len(msgstr) < 11: # {"cmd":"a"} ftlog.warn('simple json format check too short ! [' + repr(msgstr) + ']') return if msgstr[0] == '[': # 代理机器校验 _proxyCheck(msgstr, self) return if msgstr[0] != '{': ftlog.warn('simple json format check not start with { ! [' + repr(msgstr[0:10]) + '...]') return # 后3位可能是 }\n\0 或 }\n 或 }\0 或 } 或 }\r\n if msgstr[-1] == '}': pass elif msgstr[-2] == '}': pass # msgstr = msgstr[0:-1] elif msgstr[-3] == '}': pass # msgstr = msgstr[0:-2] elif msgstr[-4] == '}': pass # msgstr = msgstr[0:-3] elif msgstr[-5] == '}': pass # msgstr = msgstr[0:-4] else: ftlog.warn('simple json format check not end with } ! [...' + repr(msgstr[-10:]) + ']') return if ide_debug(): ide_print_pack("RECV TCP_", json.loads(msgstr)) userId = strutil.getJsonInt(msgstr, 'userId', 0) if userId <= 0: ftlog.warn( 'COTCPProto-doClientTcpMsg the userId error, ignore this message :', userId, msgstr) return msgqueue = _MSG_QUEUES.get(userId, None) if msgqueue == None: msgqueue = [] _MSG_QUEUES[userId] = msgqueue ftlog.debug('creat user msgqueue !', userId) if len(msgqueue) > _MSG_QUEUES_MAX_LEN and msgstr.find( '"conn_lost"') < 0: # TODO 这个经验值如何确定? ftlog.warn( 'the user msgqueue queue too large !!, ignore this message :', userId) return msgqueue.append(msgstr) if len(msgqueue) > 1: ftlog.debug('the user msgqueue is process, wait ...', userId) return ftlog.debug('process user msgqueue !', userId) while 1: msgstr1 = msgqueue[0] try: self._processUserMessage(userId, msgstr1) except: ftlog.error('ERROR _processUserMessage', userId, msgstr1) del msgqueue[0] if len(msgqueue) == 0: break del _MSG_QUEUES[userId] ftlog.debug('remove user msgqueue !', userId)