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); } }
public void CreateGameSession(Relay server) { GameSession newSession = new GameSession(); newSession.server = server; sessions.Add(server.relayID, newSession); }
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); }
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()); } }
private Dictionary <Guid, GameSession> sessions = new Dictionary <Guid, GameSession>(); // key = server id public void AddRelay(Relay relay) { relays.Add(relay); }
public void ConnectToServer(Relay client, string serverName) { Console.WriteLine("Connecting to server by name is not implemented anymore"); }
public void RemoveClient(Relay client) { clients.Remove(client); }
public void AddRelay(Relay relay) { relays.Add(relay); }
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); } }
public void AddClient(Relay client) { clients.Add(client); client.ChangeClientName(server.GetName() + clientCounter.ToString()); ++clientCounter; }
/// <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)); }