Пример #1
0
        public void RemoveRelay(Relay relay, bool disconnect = true)
        {
            if ((relay.GetGameType() == Relay.GameType.Client) && (relay.myServer != null))
            {
                Guid serverID = relay.myServer.relayID;
                if (sessions.ContainsKey(serverID))
                {
                    sessions[serverID].RemoveClient(relay);
                    // only disconnect from server if necessary
                    if (disconnect)
                    {
                        relay.myServer.DisconnectClient(relay.relayID);
                    }
                }
            }
            else if (relay.GetGameType() == Relay.GameType.Server)
            {
                Guid serverID = relay.relayID;
                if (sessions.ContainsKey(serverID))
                {
                    List <Relay> sessionClients = sessions[serverID].GetClients();
                    foreach (Relay client in sessionClients)
                    {
                        client.DisconnectServer();
                    }
                    sessions.Remove(serverID);
                }
            }

            if (relays.Contains(relay))
            {
                relays.Remove(relay);
            }
        }
Пример #2
0
        public void CreateGameSession(Relay server)
        {
            GameSession newSession = new GameSession();

            newSession.server = server;
            sessions.Add(server.relayID, newSession);
        }
Пример #3
0
 public void ExchangeRelays(Relay oldRelay, Relay newRelay)
 {
     if (oldRelay.myServer != null && (oldRelay.myServer.GetGameType() == Relay.GameType.Server) && sessions.ContainsKey(oldRelay.myServer.relayID))
     {
         sessions[oldRelay.myServer.relayID].RemoveClient(oldRelay);
         sessions[oldRelay.myServer.relayID].AddClient(newRelay);
     }
     // remove relay, but do not disconnect the client from the server; the server shall continue to think that the client is still there
     relays.Remove(oldRelay);
     //AddRelay(newRelay);
 }
Пример #4
0
        public void ConnectToServer(Relay client, Guid serverID)
        {
            Relay server = GetRelay(serverID);
              if ((server != null) && (server.GetGameType() == Relay.GameType.Server) && sessions.ContainsKey(serverID))
              {
            sessions[serverID].AddClient(client);
            client.myServer = server;

            client.SendMessage("ServerConnect " + serverID.ToString());
            server.SendMessage("CreatePlayer " + client.relayID.ToString());

            Console.WriteLine("Client {0} connected to server {1}", client.GetName(), serverID.ToString());

            return;
              }
              else
              {
            Console.WriteLine("Client {0} failed to connect to server {1}", client.GetName(), serverID.ToString());
              }
        }
Пример #5
0
        public void ConnectToServer(Relay client, Guid serverID)
        {
            Relay server = GetRelay(serverID);

            if ((server != null) && (server.GetGameType() == Relay.GameType.Server) && sessions.ContainsKey(serverID))
            {
                sessions[serverID].AddClient(client);
                client.myServer = server;

                client.SendMessage("ServerConnect " + serverID.ToString());
                server.SendMessage("CreatePlayer " + client.relayID.ToString());

                Console.WriteLine("Client {0} connected to server {1}", client.GetName(), serverID.ToString());

                return;
            }
            else
            {
                Console.WriteLine("Client {0} failed to connect to server {1}", client.GetName(), serverID.ToString());
            }
        }
Пример #6
0
        private Dictionary <Guid, GameSession> sessions = new Dictionary <Guid, GameSession>(); // key = server id


        public void AddRelay(Relay relay)
        {
            relays.Add(relay);
        }
Пример #7
0
 public void ConnectToServer(Relay client, string serverName)
 {
     Console.WriteLine("Connecting to server by name is not implemented anymore");
 }
Пример #8
0
 public void RemoveClient(Relay client)
 {
     clients.Remove(client);
 }
Пример #9
0
 public void CreateGameSession(Relay server)
 {
     GameSession newSession = new GameSession();
       newSession.server = server;
       sessions.Add(server.relayID, newSession);
 }
Пример #10
0
 public void ConnectToServer(Relay client, string serverName)
 {
     Console.WriteLine("Connecting to server by name is not implemented anymore");
 }
Пример #11
0
 public void AddRelay(Relay relay)
 {
     relays.Add(relay);
 }
Пример #12
0
        public void RemoveRelay(Relay relay, bool disconnect = true)
        {
            if ((relay.GetGameType() == Relay.GameType.Client) && (relay.myServer != null))
              {
            Guid serverID = relay.myServer.relayID;
            if (sessions.ContainsKey(serverID))
            {
              sessions[serverID].RemoveClient(relay);
              // only disconnect from server if necessary
              if (disconnect)
              {
            relay.myServer.DisconnectClient(relay.relayID);
              }
            }
              }
              else if (relay.GetGameType() == Relay.GameType.Server)
              {
            Guid serverID = relay.relayID;
            if (sessions.ContainsKey(serverID))
            {
              List<Relay> sessionClients = sessions[serverID].GetClients();
              foreach (Relay client in sessionClients)
              {
            client.DisconnectServer();
              }
              sessions.Remove(serverID);
            }
              }

              if (relays.Contains(relay))
              {
            relays.Remove(relay);
              }
        }
Пример #13
0
 public void ExchangeRelays(Relay oldRelay, Relay newRelay)
 {
     if (oldRelay.myServer != null && (oldRelay.myServer.GetGameType() == Relay.GameType.Server) && sessions.ContainsKey(oldRelay.myServer.relayID))
       {
     sessions[oldRelay.myServer.relayID].RemoveClient(oldRelay);
     sessions[oldRelay.myServer.relayID].AddClient(newRelay);
       }
       // remove relay, but do not disconnect the client from the server; the server shall continue to think that the client is still there
       relays.Remove(oldRelay);
       //AddRelay(newRelay);
 }
Пример #14
0
 public void AddClient(Relay client)
 {
     clients.Add(client);
     client.ChangeClientName(server.GetName() + clientCounter.ToString());
     ++clientCounter;
 }
Пример #15
0
        /// <summary>
        /// Distinguishes between four types of messages:
        /// * "Server"/"Client": set role of the connecting client
        /// * "RequestServerList": client requests a list of servers available
        /// * "ConnectTo servername": client request to connect to a certain server
        /// * "Cmd receiver parameters ...": relay message to receiver
        /// </summary>
        /// <param name="e">The message to be parsed</param>
        protected override void OnMessage(MessageEventArgs e)
        {
            if (e.Type == Opcode.Text)
            {
                // determine role of connecting client (server or client) or handle request for list of servers
                if (e.Data.StartsWith("Server", StringComparison.Ordinal))
                {
                    gameType = GameType.Server;
                    RelayManager.instance.CreateGameSession(this);
                    Send("ServerID " + relayID.ToString());
                    Send("SessionID " + RelayManager.instance.GetSessionID(relayID));
                    return;
                }
                if (e.Data.StartsWith("Client", StringComparison.Ordinal))
                {
                    gameType = GameType.Client;
                    // new connection?
                    if (e.Data == "Client")
                    {
                        Send("ClientID " + relayID.ToString());
                    }
                    // in case of a reconnect search for the existing relay and use its ID
                    else
                    {
                        Guid oldClientID;
                        try
                        {
                            oldClientID = new Guid(e.Data.Replace("Client ", ""));
                            Console.WriteLine("Reconnecting: {0}", oldClientID.ToString());
                        }
                        catch (FormatException exc)
                        {
                            Console.WriteLine("{0}: {1}", exc.Message, e.Data);
                            Send("Reconnect failed");
                            return;
                        }
                        if (oldClientID != Guid.Empty)
                        {
                            Relay oldRelay = RelayManager.instance.GetRelay(oldClientID);
                            if (oldRelay != null)
                            {
                                relayID  = oldClientID;
                                myServer = oldRelay.myServer;
                                RelayManager.instance.ExchangeRelays(oldRelay, this);
                                Send("Reconnect successful");
                            }
                        }
                    }
                    return;
                }
                if (e.Data.StartsWith("RequestServerList", StringComparison.Ordinal))
                {
                    SendSessionList();
                    return;
                }

                // connection request by a client
                if (e.Data.StartsWith("ConnectTo", StringComparison.Ordinal) && (gameType == GameType.Client))
                {
                    string connectionType = e.Data.Replace("ConnectTo ", "");
                    if (connectionType.StartsWith("Name", StringComparison.Ordinal))
                    {
                        string serverName = connectionType.Replace("Name ", "");

                        Console.WriteLine("Trying to find server {0}", serverName);

                        RelayManager.instance.ConnectToServer(this, serverName);
                        return;
                    }
                    else if (connectionType.StartsWith("Guid", StringComparison.Ordinal))
                    {
                        string serverGuid = connectionType.Replace("Guid ", "");

                        Console.WriteLine("Trying to find server {0}", serverGuid);

                        RelayManager.instance.ConnectToServer(this, new Guid(serverGuid));
                        return;
                    }
                }

                // generic command which will be relayed to designated receiver
                if (e.Data.StartsWith("Cmd", StringComparison.Ordinal))
                {
                    string[] messageParts = e.Data.Split(new Char [] { ' ' });
                    string   receiver     = messageParts[1];
                    // replace receiver with sender before relaying the message
                    messageParts[1] = messageParts[1].Replace(receiver, relayID.ToString());
                    // rebuild message string
                    string relayedMessage = messageParts[0];
                    for (int partCount = 1; partCount < messageParts.Length; ++partCount)
                    {
                        relayedMessage = relayedMessage + " " + messageParts[partCount];
                    }

                    Console.WriteLine("Message for {0}: {1}", receiver, relayedMessage);

                    Relay receiverRelay = RelayManager.instance.GetRelay(new Guid(receiver));
                    if (receiverRelay != null)
                    {
                        receiverRelay.SendMessage(relayedMessage);
                    }
                    return;
                }
            }

            Send("Message unknown: " + e.Data);
            //Sessions.Broadcast (String.Format ("{0}: {1}", name, e.Data));
        }
Пример #16
0
 public void RemoveClient(Relay client)
 {
     clients.Remove(client);
 }
Пример #17
0
 public void AddClient(Relay client)
 {
     clients.Add(client);
       client.ChangeClientName(server.GetName() + clientCounter.ToString());
       ++clientCounter;
 }