Ejemplo n.º 1
0
        public void OnSocketListenerMessageReceiveConnect(ServerClient client, ServiceDesc desc)
        {
            //var clientId = desc.ClientId;
            //var characterId = desc.CharacterId;
            ClientRouting clientRouting = null;

            if (desc.ServiceType == 2)
            {
                client.UserData = desc.ClientId;
                return;
            }

            if (!mFromClientId2Login.TryGetValue(desc.ClientId, out clientRouting))
            {
                var index  = mRandomNumber.Next(mBackEnds.Count);
                var server = mBackEnds[index];

                clientRouting = new ClientRouting
                {
                    Server          = server,
                    LastMessageTime = DateTime.Now
                };

                mFromClientId2Login[desc.ClientId] = clientRouting;
            }

            mFromClientId2Gate[desc.ClientId] = client;
            desc.Routing.Add((ulong)client.UserData);

            try
            {
                clientRouting.Server.SendMessage(desc);
            }
            catch (Exception ex)
            {
                Logger.Warn(ex, "Send message failed. 5");
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        ///     This function will be called in multithread, so THREAD SAFE is very important.
        ///     Called when gate pass a message, or other server pass a message.
        /// </summary>
        /// <param name="client"></param>
        /// <param name="desc"></param>
        public void ClientMessageReceived(ServerClient client, ServiceDesc desc)
        {
            try
            {
                var clientId    = desc.ClientId;
                var characterId = desc.CharacterId;

                Logger.Debug("Recieved a message from client {0}", clientId);

                ClientRouting clientRouting = null;

                if (desc.Type == (int)MessageType.CS || desc.Type == (int)MessageType.Sync)
                {
                    if (!mFromClientId2Login.TryGetValue(desc.ClientId, out clientRouting))
                    {
                        Logger.Warn("Can not find client {0}. ", desc.ClientId);
                        return;
                    }

                    try
                    {
                        // 只要消息经过这里,就给Gate回复一个这个消息,后面的消息就不应该到这里了,Gate会直接发送到Server上。
                        var gateDesc = new ServiceDesc();
                        gateDesc.Type        = 20;
                        gateDesc.CharacterId = characterId;
                        gateDesc.ServiceType = desc.ServiceType;
                        gateDesc.ClientId    = desc.ClientId;
                        gateDesc.Routing.Add((ulong)client.UserData);
                        clientRouting.Server.SendMessage(gateDesc);

                        clientRouting.Server.SendMessage(desc);
                    }
                    catch (Exception ex)
                    {
                        Logger.Warn(ex, "Send message failed. 4");
                    }

                    clientRouting.LastMessageTime = DateTime.Now;

                    Interlocked.Increment(ref mPackageCount);
                }
                else if (desc.Type == (int)MessageType.SS)
                {
                    ClientRouting server;
                    if (mFromClientId2Login.TryGetValue(clientId, out server))
                    {
                        desc.Routing.Add(client.ClientId);
                        server.Server.SendMessage(desc);
                        return;
                    }

                    if (clientId == 0)
                    {
                        var index   = mRandomNumber.Next(mBackEnds.Count);
                        var backend = mBackEnds[index];
                        desc.Routing.Add(client.ClientId);
                        backend.SendMessage(desc);
                        return;
                    }

                    Logger.Warn("Can not find client id for ss message. {0}", clientId);
                }
                else if (desc.Type == (int)MessageType.SAS)
                {
                    desc.Routing.Add(client.ClientId);
                    var reply = new ServiceDesc();
                    reply.Type        = (int)MessageType.SASReply;
                    reply.CharacterId = desc.CharacterId;
                    reply.ServiceType = desc.ServiceType;
                    reply.ClientId    = desc.ClientId;
                    reply.PacketId    = desc.PacketId;
                    reply.FuncId      = desc.FuncId;
                    ulong i = 0;
                    foreach (var socketClient in mBackEnds)
                    {
                        socketClient.SendMessage(desc);
                        i++;
                    }
                    reply.Routing.Add(i);
                    client.SendMessage(reply);
                }
                else if (desc.Type == (int)MessageType.SCAll)
                {
                    var gates = mFromClientId2Gate.Values.Distinct();
                    foreach (var gate in gates)
                    {
                        gate.SendMessage(desc);
                    }
                }
                else if (desc.Type == (int)MessageType.SCServer)
                {
                    Logger.Error("B2S is not supported in login server.");
                }
                else if (desc.Type == (int)MessageType.SCList)
                {
                    var clients = desc.Routing;

                    var dictionary = new Dictionary <ServerClient, List <ulong> >();
                    foreach (var v in clients)
                    {
                        var          gate = mFromClientId2Gate[v];
                        List <ulong> c;
                        if (!dictionary.TryGetValue(gate, out c))
                        {
                            c = new List <ulong>();
                            dictionary.Add(gate, c);
                        }

                        c.Add(v);
                    }

                    desc.Routing.Clear();
                    foreach (var gate in dictionary)
                    {
                        var msg = new ServiceDesc();
                        msg.Data        = desc.Data;
                        msg.ClientId    = desc.ClientId;
                        msg.PacketId    = desc.PacketId;
                        msg.FuncId      = desc.FuncId;
                        msg.ServiceType = desc.ServiceType;
                        msg.Error       = desc.Error;
                        msg.Type        = desc.Type;
                        msg.CharacterId = desc.CharacterId;
                        msg.Routing.AddRange(gate.Value);
                        gate.Key.SendMessage(msg);
                    }
                }
                else if (desc.Type == (int)MessageType.Connect)
                {
                    OnSocketListenerMessageReceiveConnect(client, desc);
                }
                else if (desc.Type == (int)MessageType.Lost)
                {
                    OnSocketListenerMessageReceiveLost(client, desc);
                }
//                 else if (desc.ServiceType == 99999)
//                 {
//                     desc.Routing.Add(client.ClientId);
//                     foreach (var end in mBackEnds)
//                     {
//                         end.SendMessage(desc);
//                     }
//                 }
                else
                {
                    Logger.Warn("Login broker can not deal with this message type: " + desc.Type);
                }
            }
            catch (Exception ex)
            {
                Logger.Warn(ex, "Some error inside ClientMessageReceived ");
            }
        }