예제 #1
0
        public void HandleMsg(IFFSocket ffsocket, UInt16 cmd, byte[] strMsg)
        {
            var sessionData = ffsocket.GetSessionData();

            if (sessionData == null)//!first msg
            {
                string strDefaultWorker = "worker#0";
                if (m_ffrpc.IsExistNode(strDefaultWorker) == false)
                {
                    //ffsocket.Close();
                    FFLog.Error(string.Format("gate worker[{0}] not exist", strDefaultWorker));
                    FFNet.SendMsg(ffsocket, 256, Util.String2Byte("server is busy!0x0!你好"));
                    return;
                }
                Int64      sessionIDNew = ++m_nIDGenerator;
                ClientInfo cinfo        = new ClientInfo()
                {
                    sockObj = ffsocket, sessionID = sessionIDNew, strAllocWorker = strDefaultWorker
                };
                ffsocket.SetSessionData(sessionIDNew);
                m_dictClients[sessionIDNew] = cinfo;
                RouteLogicMsg(cinfo, cmd, strMsg, true);
                return;
            }
            Int64 sessionID = (Int64)sessionData;

            if (m_dictClients.ContainsKey(sessionID) == false)
            {
                return;
            }
            ClientInfo cinfo2 = m_dictClients[sessionID];

            RouteLogicMsg(cinfo2, cmd, strMsg, false);
        }
예제 #2
0
 //! 广播消息给所有的client
 public EmptyMsgRet BroadcastMsgToSession(GateBroadcastMsgToSessionReq reqMsg)
 {
     byte[] dataBody = reqMsg.Body;
     foreach (var cinfo in m_dictClients.Values)
     {
         FFNet.SendMsg(cinfo.sockObj, (UInt16)reqMsg.Cmd, dataBody);
     }
     return(m_msgEmpty);
 }
예제 #3
0
        public void HandleMsg(IFFSocket ffsocket, UInt16 cmd, byte[] strMsg)
        {
            //FFLog.Trace(string.Format("FFBroker handleMsg....{0}, {1} [{2}]", cmd, strMsg.Length, System.Threading.Thread.CurrentThread.ManagedThreadId.ToString()));
            try
            {
                switch ((FFRPC_CMD)cmd)
                {
                case FFRPC_CMD.REGISTER_TO_BROKER_REQ:
                {
                    RegisterToBrokerReq reqMsg = new RegisterToBrokerReq();
                    FFNet.DecodeMsg(reqMsg, strMsg);
                    FFLog.Trace(string.Format("FFBroker handleMsg.REGISTER_TO_BROKER_REQ....{0}, {1}", reqMsg.Node_type, reqMsg.Service_name));
                    if (FFRPC_NODE_TYPE.RPC_NODE == (FFRPC_NODE_TYPE)reqMsg.Node_type)
                    {
                        if (m_brokerData.Service2node_id.ContainsKey(reqMsg.Service_name))
                        {
                            FFLog.Error(string.Format("FFBroker handleMsg servicename exist....{0}, {1}", reqMsg.Node_type, reqMsg.Service_name));
                            ffsocket.Close();
                            return;
                        }
                        Int64 nNodeID = allocNodeId();
                        m_dictSockets[nNodeID] = ffsocket;
                        m_brokerData.Service2node_id[reqMsg.Service_name] = nNodeID;
                        m_brokerData.Node_id = nNodeID;
                        SyncNodeInfo(m_brokerData, ffsocket);        //!广播给所有的子节点
                    }
                } break;

                case FFRPC_CMD.BROKER_ROUTE_MSG:
                {
                    BrokerRouteMsgReq reqMsg = new BrokerRouteMsgReq();
                    FFNet.DecodeMsg(reqMsg, strMsg);
                    FFLog.Trace(string.Format("FFBroker.BROKER_ROUTE_MSG service={0},func={1} Callback={2}",
                                              reqMsg.Dest_service_name, reqMsg.Dest_msg_name, reqMsg.Callback_id));
                    if (!m_dictSockets.ContainsKey(reqMsg.Dest_node_id))
                    {
                        return;
                    }
                    IFFSocket destSocket = m_dictSockets[reqMsg.Dest_node_id];
                    FFNet.SendMsg(destSocket, (UInt16)FFRPC_CMD.BROKER_TO_CLIENT_MSG, reqMsg);
                } break;

                default: break;
                }
            }
            catch (Exception ex)
            {
                FFLog.Error("FFBroker.Error:" + ex.Message);
            }
        }
예제 #4
0
 //! 转发消息给client
 public EmptyMsgRet RouteMsgToSession(GateRouteMsgToSessionReq reqMsg)
 {
     byte[] dataBody = reqMsg.Body;// Util.String2Byte(reqMsg.Body);
     foreach (var sessionID in reqMsg.SessionId)
     {
         if (m_dictClients.ContainsKey(sessionID) == false)
         {
             continue;
         }
         ClientInfo cinfo = m_dictClients[sessionID];
         FFNet.SendMsg(cinfo.sockObj, (UInt16)reqMsg.Cmd, dataBody);
     }
     return(m_msgEmpty);
 }
예제 #5
0
        public bool ConnectToBroker()
        {
            m_socketBroker = FFNet.Connect(m_strBrokerHost, new SocketMsgHandler(HandleMsg), new SocketBrokenHandler(HandleBroken));
            if (null == m_socketBroker)
            {
                return(false);
            }
            RegisterToBrokerReq reqMsg = new RegisterToBrokerReq {
                Node_type = 2, Service_name = m_strServiceName
            };

            FFNet.SendMsg(m_socketBroker, (UInt16)FFRPC_CMD.REGISTER_TO_BROKER_REQ, reqMsg);
            return(true);
        }
예제 #6
0
 private void SyncNodeInfo(RegisterToBrokerRet retMsg, IFFSocket ffsocket)//! 同步给所有的节点,当前的各个节点的信息
 {
     //!广播给所有的子节点
     foreach (IFFSocket s in m_dictSockets.Values)
     {
         if (s == ffsocket)
         {
             retMsg.Register_flag = 1;
         }
         else
         {
             retMsg.Register_flag = 0;
         }
         FFNet.SendMsg(s, (UInt16)FFRPC_CMD.REGISTER_TO_BROKER_RET, retMsg);
     }
 }
예제 #7
0
 public void SendToDestNode(BrokerRouteMsgReq retMsg)
 {
     retMsg.From_node_id = m_nNodeID;
     FFNet.SendMsg(m_socketBroker, (UInt16)FFRPC_CMD.BROKER_ROUTE_MSG, retMsg);
 }