Beispiel #1
0
 // Remove peer from guid.
 public void RemovePeer(Guid guid)
 {
     if (ConnectedClients.ContainsKey(guid))
     {
         ConnectedClients.Remove(guid);
     }
 }
        /// <summary>
        /// Wird aufgerufen, wenn eine neue Nachricht empfangen wurde.
        /// An dieser Stelle werden NUR Nachrichten, die der Verbindungshaltung dienen, verarbeitet (ID kleiner als 9)
        /// </summary>
        /// <param name="msg">Die Nachricht</param>
        protected override void OnSMCPMessageReceived(SMCPMessage msg)
        {
            Log("Message Received: " + msg.ToString());
            if (msg.ActionID <= 9)
            {
                switch ((SMCPAction)msg.ActionID)
                {
                case SMCPAction.ASSIGN_CLIENT_ID:
                    LocalClient.ClientID = Serializer.ConvertToObject <short>(msg.Data);
                    SMCPMessage reply = this.CreateMessage(LocalClient, false, SMCPAction.CLIENT_INFO);
                    SendMessage(reply);
                    break;

                case SMCPAction.ONLINE_CLIENTS:
                    ConnectedClients = Serializer.ConvertToObject <Dictionary <short, ClientInfo> >(msg.Data);
                    if (ConnectedClients.ContainsKey(0))
                    {
                        if (ConnectedClients[0].IsServer)
                        {
                            ConnectedClients[0].TcpClient = Server.TcpClient;
                            Server = ConnectedClients[0];
                        }
                    }
                    OnClientsChanged();
                    break;
                }
            }
            base.OnSMCPMessageReceived(msg);
        }
Beispiel #3
0
 // Peer's operation.
 public void AddConenectPeer(Guid guid, ServerPeer peer)
 {
     if (!ConnectedClients.ContainsKey(guid))
     {
         ConnectedClients.Add(guid, peer);
         ServerApp.Logger.Info("[ActorManager]Add peer linked. " + guid);
     }
 }
Beispiel #4
0
 /// <summary>
 /// 类型:方法
 /// 名称:RemovePeer
 /// 作者:taixihuase
 /// 作用:删除一个客户端连接
 /// 编写日期:2015/7/12
 /// </summary>
 /// <param name="guid"></param>
 public void RemovePeer(Guid guid)
 {
     if (ConnectedClients.ContainsKey(guid))
     {
         ConnectedClientsToBroadcast.Remove(ConnectedClients[guid]);
         ConnectedClients.Remove(guid);
     }
 }
Beispiel #5
0
        private uint GetId()
        {
            uint i = 0;

            while (ConnectedClients.ContainsKey(i))
            {
                i++;
            }
            return(i);
        }
Beispiel #6
0
 /// <summary>
 /// 类型:方法
 /// 名称:TryGetPeer
 /// 作者:taixihuase
 /// 作用:尝试通过索引键获取客户端连接
 /// 编写日期:2015/7/12
 /// </summary>
 /// <param name="guid"></param>
 /// <returns></returns>
 public ServerPeer TryGetPeer(Guid guid)
 {
     if (ConnectedClients.ContainsKey(guid))
     {
         ServerPeer peer;
         ConnectedClients.TryGetValue(guid, out peer);
         return(peer);
     }
     return(null);
 }
Beispiel #7
0
 /// <summary>
 /// Disconnects a client node from this server
 /// </summary>
 /// <param name="client"></param>
 public void DisconnectNode(INetworkNode client)
 {
     if (ConnectedClients.ContainsKey(client))
     {
         if (client.Socket != null && client.Socket.Connected)
         {
             client.Socket.Disconnect(false);
             ConnectedClients[client].Abort();
         }
         ConnectedClients.Remove(client);
     }
 }
 private void PacketHandlerLoop()
 {
     while (!_stopping)
     {
         NewPacketStruct packetStruct;
         while (_newPackets.TryDequeue(out packetStruct))
         {
             var  stream       = new BitStream(packetStruct.Data);
             uint type         = 0;
             uint connectionId = 0;
             stream.ReadBasicHeader(ref type, ref connectionId);
             Console.WriteLine("[NetworkingServer] handling packet received from " + packetStruct.From.ToString() + ", connection id: " + connectionId + ", packet type: " + Convert.ToString((PacketType)type));
             if (type == 0)
             {
                 Console.WriteLine("[NetworkingServer] skipping invalid packet");
                 continue;
             }
             if (type == 1)
             {
                 var par2       = stream.ReadBits(32);
                 var version    = stream.ReadBits(32);
                 var punkbuster = stream.ReadBits(1);
                 var unk        = stream.ReadBits(32);
                 var pass       = stream.ReadString(32).Replace("\0", "");
                 var mod        = stream.ReadString(32).Replace("\0", "");
                 if (mod != Config.ModName)
                 {
                     SendConnectDenied(packetStruct.From, 0x24);
                 }
                 ConnectionId++;
                 var client = new NetworkingClient(this, packetStruct.From, ConnectionId);
                 if (ConnectedClients.ContainsKey(packetStruct.From))
                 {
                     ConnectedClients.Remove(packetStruct.From);
                 }
                 ConnectedClients.Add(packetStruct.From, client);
                 SendConnectAccept(packetStruct.From, ConnectionId);
                 continue;
             }
             if (!ConnectedClients.ContainsKey(packetStruct.From))
             {
                 continue;
             }
             ConnectedClients[packetStruct.From].Handle((PacketType)type, stream);
         }
         Thread.Sleep(1);
     }
 }
        private void InitiateOpenServer()
        {
            fileManagement = new FileManagement();
            fileManagement.read();

            RServer openServer = new RServer(fileManagement.fileData.myIpAddress, OPEN_COMMUNICATION_PORT.ToString());

            openServer.setOnNewDeviceConnectedCallback(
                new RServer.NewDeviceConnected(
                    (RServer _client, CommunicationNetworkStream _stream) =>
            {
                //CHECK IF THIS CLIENT IS ACTUALLY WANTS TO HAVE A NEW CONNECTION
                string __data      = _stream.ReadString(true);
                string[] __pp      = __data.Split(':');
                string requestCode = __pp[0];
                switch (requestCode)
                {
                case "NEW_CONNECTION":
                    allcoateNewConnection(_client, _stream);
                    break;

                case "NEW_OR_REDIRECT_CONNECTION": //NEW_OR_REDIRECT_CONNECTION:othId
                    if (ConnectedClients.ContainsKey(__pp[1]))
                    {                              //THE CLIENT HAS AN ALREADY ALLOCATED PORT
                                                   //INSTRUCT TO MOVE
                        NetworkClient cL = ((NetworkClient)ConnectedClients[__pp[1]]);
                        _stream.WriteString($"MOVE_TO_PORT:{cL.clientPort.ServerPort}:{cL.othId}");

                        Debug.WriteLine($"NEW_OR_REDIRECT_CONNECTION: redirected to port.{cL.clientPort.ServerPort}:{cL.othId}");
                    }
                    else
                    {
                        allcoateNewConnection(_client, _stream); MessageBox.Show("NEW_OR_REDIRECT_CONNECTION: new port allocated");
                    }

                    break;
                }
            }
                    )
                );

            openServer.Initialize(true);
        }
Beispiel #10
0
        public static void HandleNewMessage(byte[] message, SocketClient client, int readBytes)
        {
            var messageToText = Encoding.ASCII.GetString(message, 0, readBytes);

            if (client.ClientName == "")
            {
                ChatStore.HandleName(messageToText, client);
                client.ClientName = client.ClientName.Split().First();
            }
            else
            {
                if (!ConnectedClients.ContainsKey(client.SocketId))
                {
                    ChatStore.HandleNewClient(client, messageToText);
                }
                else
                {
                    var targetChat = ChatsClientMapping[client.SocketId];

                    if (messageToText.StartsWith("/"))
                    {
                        Commands(messageToText, client, targetChat);
                    }
                    else
                    {
                        foreach (var clientInChat in Chats[targetChat])
                        {
                            if (client.SocketId == clientInChat.SocketId)
                            {
                                clientInChat.SendPacketIntoSocket($"You: {messageToText}" + "\r\n");
                                continue;
                            }
                            clientInChat.SendPacketIntoSocket($"{client.ClientName}: {messageToText}" + "\r\n");
                        }
                    }
                }
            }
        }
Beispiel #11
0
        /// <summary>
        /// 加入一筆線上會員資料(成功回傳 (1),不成功回傳 (2)錯誤碼)
        /// </summary>
        /// <param name="guid"></param>
        /// <param name="PrimaryID"></param>
        /// <param name="Account"></param>
        /// <param name="Nickname"></param>
        /// <param name="Age"></param>
        /// <param name="Sex"></param>
        /// <param name="IP"></param>
        /// <param name="ServerPeer"></param>
        /// <returns></returns>

        public ActorReturn ActorOnline(Guid guid, int PrimaryID, string Account, string Nickname, byte Age, byte Sex, string IP, MPServerPeer serverPeer)
        {
            ActorReturn actorReturn = new ActorReturn();

            actorReturn.ReturnCode = "S300";

            if (PrimaryID <= 0)
            {
                actorReturn.ReturnCode   = "S303";
                actorReturn.DebugMessage = "PrimaryID必須有索引值!";
                return(actorReturn);
            }

            if (Account.Length <= 0)
            {
                actorReturn.ReturnCode   = "S304";
                actorReturn.DebugMessage = "Account必須填入帳號!";
                return(actorReturn);
            }

            if (Nickname.Length <= 0)
            {
                actorReturn.ReturnCode   = "S305";
                actorReturn.DebugMessage = "Nickname必須填入角色名稱!";
                return(actorReturn);
            }

            if (Age <= 0)
            {
                actorReturn.ReturnCode   = "S306";
                actorReturn.DebugMessage = "Age必須填入年齡!";
                return(actorReturn);
            }

            if (Sex < 0)
            {
                actorReturn.ReturnCode   = "S307";
                actorReturn.DebugMessage = "Sex必須填入性別!";
                return(actorReturn);
            }


            try
            {
                lock (this)
                {
                    // PrimaryGetGuid[i] 不能有null值 不能用來判斷bool ,PrimaryGetGuid.ContainsKey(i) 可以用來判斷bool
                    // 檢查dictGetAccounts的索引確保沒有重複登入
                    if (PrimaryGetGuid.ContainsKey(PrimaryID))
                    {
                        actorReturn.ReturnCode   = "S302";
                        actorReturn.DebugMessage = "重複登入!";
                        return(actorReturn);                              // 不允許重複登入
                    }
                    else
                    {
                        Log.Debug("登入的GUID:" + guid);
                        GuidGetPrimary.Add(guid, PrimaryID);             // 加入guid索引會員編號的列表

                        Actor actor = new Actor(guid, PrimaryID, Account, Nickname, Age, Sex, IP);
                        actor.LoginTime  = System.DateTime.Now;         // 登入時間
                        actor.GameStatus = 1;                           // 代表上線中(閒置)

                        if (!ConnectedClients.ContainsKey(guid))
                        {
                            ConnectedClients.Add(guid, serverPeer);
                            Log.Debug("ADD Peer!");
                        }

                        if (!PrimaryGetActor.ContainsKey(PrimaryID))
                        {
                            PrimaryGetActor.Add(PrimaryID, actor);        // 加入線上會員列表
                        }
                        if (!PrimaryGetNickname.ContainsKey(PrimaryID))   // 加入線上會員名稱 索引
                        {
                            PrimaryGetNickname.Add(PrimaryID, Nickname);
                        }

                        if (!PrimaryGetAccount.ContainsKey(PrimaryID))      // 加入線上帳號名稱 索引
                        {
                            PrimaryGetAccount.Add(PrimaryID, Account);
                        }

                        if (!PrimaryGetGuid.ContainsKey(PrimaryID))         // 加入線上GUID名稱 索引
                        {
                            PrimaryGetGuid.Add(PrimaryID, guid);
                        }

                        if (!AccountGetPrimary.ContainsKey(Account))    // 若會員帳號索引會員編號列表沒有資料,加入索引
                        {
                            AccountGetPrimary.Add(Account, PrimaryID);
                        }

                        if (!NicknameGetPrimary.ContainsKey(Nickname))  // 若會員帳號暱稱索引會員編號列表沒有資料,加入索引
                        {
                            NicknameGetPrimary.Add(Nickname, PrimaryID);
                        }

                        actorReturn.ReturnCode   = "S301";                   // 加入線上會員資料成功
                        actorReturn.DebugMessage = "";
                    }
                }
                return(actorReturn);
            }
            catch (Exception e)
            {
                Log.Debug("Actors例外: " + e);
                actorReturn.ReturnCode   = "S399";                   // 加入線上會員資料成功
                actorReturn.DebugMessage = "未知例外情況";
                return(actorReturn);
            }
        }