コード例 #1
0
    def unresolve_msg(self, msg):
        # 转发消息
        smart_log('收到消息\r\n %s' % msg.head)
        if msg.head.direction == DirectionType.ToWebServer:
            print("转发Web服务的数据包: {}".format(msg))
            if msg.head.tag == 2 and msg.head.serverTokenId and web_service_dict[
                    msg.head.serverTokenId]:
                # 为某个请求的返回, 并且需要原路返回
                web_service_dict[msg.head.serverTokenId]["protocal"].send_msg(
                    msg=msg, use_raw_buf=True)
            else:
                optimal_protocal = None
                min_payload = None
                for server_token, web_server in web_service_dict.items():
                    if not min_payload:
                        min_payload = web_server["payload"]
                        optimal_protocal = web_server["protocal"]
                    if min_payload > web_server["payload"]:
                        min_payload = web_server["payload"]
                        optimal_protocal = web_server["protocal"]
                if optimal_protocal:
                    optimal_protocal.send_msg(msg=msg, use_raw_buf=True)

        elif msg.head.direction == DirectionType.ToWxServer:
            print("转发助手服务的数据包: {}".format(msg))
            if msg.head.helperToken:
                # 获取助手指定的wx_helper_server
                helper_session = HelperSession(
                    helper_token=msg.head.helperToken,
                    helper_server_token=None)
                helper_session.get_server_token_by_helper_token()
                helper_server_token = helper_session.helper_server_token
                if helper_server_token and helper_service_dict.get(
                        helper_server_token.decode()):
                    print("指定助手转发助手服务的数据包: {}".format(msg))
                    helper_service_dict.get(
                        helper_server_token.decode())["protocal"].send_msg(
                            msg=msg, use_raw_buf=True)
                else:
                    # TODO 指定服务出现异常
                    smart_log(
                        "指定服务出现异常, helper_server_token:{}, helper_token:{}".
                        format(helper_server_token, msg.head.helperToken))
                    helper_session.delete_server_relation_by_helper_token()
            else:
                # 未指定相关助手
                optimal_protocal = None
                min_payload = None
                for server_token, helper_server in helper_service_dict.items():
                    if not min_payload:
                        min_payload = helper_server["payload"]
                        optimal_protocal = helper_server["protocal"]
                    if min_payload > helper_server["payload"]:
                        min_payload = helper_server["payload"]
                        optimal_protocal = helper_server["protocal"]
                if optimal_protocal:
                    print("选取最优助手转发助手服务的数据包: {}".format(msg))
                    optimal_protocal.send_msg(msg=msg, use_raw_buf=True)
        else:
            print("未知转发方向的数据包: {}".format(msg))
コード例 #2
0
    def remove_from_container(self):
        smart_log("移除节点 app_id:%d server_token:%s" %
                  (self.service_id, self.server_token_id))
        if self in all_node_list:
            all_node_list.remove(self)

        if self.server_token_id:
            if self.service_id == AppId.AppType_HelperServer:
                del helper_service_dict[self.server_token_id]
            elif self.service_id == AppId.AppType_WebServer:
                del web_service_dict[self.server_token_id]
コード例 #3
0
 def helper_login(self, msg):
     """
     管家登录请求
     :param msg:
     :return:
     """
     smart_log('收到管家登录请求, mark={}'.format(msg.head.mark))
     from helper.wx_hepler import HelperStart
     global Wx_Helper_Linker_Protocol
     helper_thread = HelperStart(mark=msg.head.mark,
                                 protocol=Wx_Helper_Linker_Protocol,
                                 web_server_token=msg.head.serverTokenId)
     helper_thread.start()
コード例 #4
0
    def send_message_to_wx(self, msg):
        """
        发送消息到微信
        :param msg:
        :return:
        """
        smart_log('收到发送消息到微信请求')
        helper_token = msg.head.helperToken
        msg_type = msg.body.msgType
        content = msg.body.content
        to_username_list = msg.body.toUserNameList

        wx_helper = helper_dict.get(helper_token)
        if to_username_list and len(to_username_list) > 0:
            for to_username in to_username_list:
                wx_helper.web_wx_send_msg(content, to_username)
コード例 #5
0
    def on_hub_service_register(self, msg):
        smart_log("注册:")

        # 产生服务器的唯一标识 如果服务器注册过 则使用之前的
        if msg.head.serverTokenId and len(msg.head.serverTokenId) > 0:
            server_token_id = msg.head.serverTokenId
        else:
            server_token_id = str(uuid.uuid1())

        self.server_token_id = server_token_id
        self.service_id = msg.body.serviceAppId

        head = WxHead()
        head.appId = AppId.AppType_ServerSystem
        head.functionId = FunctionId.ServerSystemServiceRegister

        if msg.body.serviceAppId == AppId.AppType_HelperServer:
            print("WxHelperServer 注册到Hub")
            helper_service_dict[server_token_id] = {
                "payload": 0,
                "protocal": self
            }
            head.direction = DirectionType.ToWxServer
        elif msg.body.serviceAppId == AppId.AppType_WebServer:
            print("WebServer 注册到Hub")
            web_service_dict[server_token_id] = {
                "payload": 0,
                "protocal": self
            }
            head.direction = DirectionType.ToWebServer

        # if msg.body.serviceAppId:
        #     smart_log("注册服务 app_id:%d server_token:%s" % (self.service_id, self.server_token_id))
        #     for sub_id in msg.body.subScribeFunctionId:
        #         if sub_id not in subscribe_dict:
        #             subscribe_dict[sub_id] = []
        #         if self not in subscribe_dict[sub_id]:
        #             subscribe_dict[sub_id].append(self)
        #             smart_log("添加订阅 app_id:%d server_token:%s" % (self.service_id, self.server_token_id))

        resp = ServiceRegisterResp()
        resp.response = ResponseInfo(code=ResponseCode.Succeed)
        resp.serverTokenId = server_token_id

        self.send_msg(head=head, body=resp)
コード例 #6
0
    def send_heartbeat(self):
        """
        发送心跳包
        :return:
        """
        now = datetime.now()
        if self.last_heartbeat_time and (now - self.last_heartbeat_time
                                         ).seconds > HEARTBEAT_MAX_INTERVAL:
            print('心跳超时,准备重连')
            smart_log('心跳超时,准备重连')
            self.task.stop()
            self.transport.loseConnection()
            return

        body = ServerHeartbeatReq()
        body.payloadCount = 0

        self.send_msg_to_hub(app_id=AppId.AppType_ServerSystem,
                             function_id=FunctionId.ServerSystemHeartbeat,
                             body=body,
                             server_token_id=self.serverTokenId)
コード例 #7
0
    def on_hub_heartbeat(self, msg):
        self.last_heartbeat_time = datetime.now()
        smart_log("心跳 app_id:%d server_token:%s" %
                  (self.service_id, self.server_token_id))
        head = WxHead()
        head.appId = AppId.AppType_ServerSystem
        head.functionId = FunctionId.ServerSystemHeartbeat
        head.direction = DirectionType.ToWxServer
        resp = ServerHeartbeatResp()
        resp.response = ResponseInfo(code=ResponseCode.Succeed)
        self.send_msg(head=head, body=resp)

        # 更新负载
        if msg.body.payloadCount:
            if msg.head.appId == AppId.AppType_HelperServer and helper_service_dict[
                    msg.head.serverTokenId]:
                helper_service_dict[
                    msg.head.serverTokenId]["payload"] = msg.body.payloadCount
            elif msg.head.appId == AppId.AppType_WebServer and web_service_dict[
                    msg.head.serverTokenId]:
                web_service_dict[
                    msg.head.serverTokenId]["payload"] = msg.body.payloadCount
コード例 #8
0
 def on_service_register(self, msg):
     self.serverTokenId = msg.body.serverTokenId
     smart_log('收到挂载包 name:%s' % self.serverTokenId)
     self.last_heartbeat_time = datetime.now()
     self.task = LoopingCall(self.send_heartbeat)
     self.task.start(HEARTBEAT_INTERVAL)
コード例 #9
0
 def connectionLost(self, reason):
     smart_log('链接断开')
     self.remove_from_container()