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"); } }
/// <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 "); } }