private void InternalStartNetworking() { Console.WriteLine(); if (!Network.Listen()) { Log.Error("An error occurred while attempting to connect."); } else { Console.WriteLine(Strings.Intro.started.ToString(Options.ServerPort)); } #if WEBSOCKETS WebSocketNetwork.Init(Options.ServerPort); Log.Pretty.Info(Strings.Intro.websocketstarted.ToString(Options.ServerPort)); Console.WriteLine(); #endif RestApi.Start(); if (!Options.UPnP || Instance.StartupOptions.NoNatPunchthrough) { return; } Console.WriteLine(); UpnP.ConnectNatDevice().Wait(5000); #if WEBSOCKETS UpnP.OpenServerPort(Options.ServerPort, Protocol.Tcp).Wait(5000); #endif UpnP.OpenServerPort(Options.ServerPort, Protocol.Udp).Wait(5000); if (RestApi.IsStarted) { RestApi.Configuration.Ports.ToList() .ForEach(port => UpnP.OpenServerPort(port, Protocol.Tcp).Wait(5000)); } Console.WriteLine(); Bootstrapper.CheckNetwork(); Console.WriteLine(); }
public WebSocketSecureNetworkSession(WebSocketSecureNetworkServer server) : base(server) { webSocketNetwork = new WebSocketNetwork(this); }
/// <summary> /// Initialize WebSocket client with a given IP endpoint /// </summary> /// <param name="context">SSL context</param> /// <param name="endpoint">IP endpoint</param> public WebSocketSecureNetworkClient(SslNetworkContext context, IPEndPoint endpoint) : base(context, endpoint) { webSocketNetwork = new WebSocketNetwork(this); }
/// <summary> /// Initialize WebSocket client with a given IP address and port number /// </summary> /// <param name="context">SSL context</param> /// <param name="address">IP address</param> /// <param name="port">Port number</param> public WebSocketSecureNetworkClient(SslNetworkContext context, String address, Int32 port) : base(context, address, port) { webSocketNetwork = new WebSocketNetwork(this); }
protected override void Dispose(bool disposing) { var stopwatch = new Stopwatch(); stopwatch.Start(); if (disposing) { #region CLEAN THIS UP // TODO: This may actually be fine here? Might want to move it into Bootstrapper though as "PrintShutdown()" Console.WriteLine(); Console.WriteLine(Strings.Commands.exiting); Console.WriteLine(); #if WEBSOCKETS Log.Info("Shutting down websockets..." + $" ({stopwatch.ElapsedMilliseconds}ms)"); WebSocketNetwork.Stop(); #endif // Except this line, this line is fine. Log.Info("Disposing network..." + $" ({stopwatch.ElapsedMilliseconds}ms)"); Network.Dispose(); // TODO: This probably also needs to not be a global, but will require more work to clean up. Log.Info("Saving player database..." + $" ({stopwatch.ElapsedMilliseconds}ms)"); DbInterface.SavePlayerDatabase(Environment.StackTrace); Log.Info("Saving game database..." + $" ({stopwatch.ElapsedMilliseconds}ms)"); DbInterface.SaveGameDatabase(); // TODO: This needs to not be a global. I'm also in the middle of rewriting the API anyway. Log.Info("Shutting down the API..." + $" ({stopwatch.ElapsedMilliseconds}ms)"); RestApi.Dispose(); #endregion if (ThreadConsole?.IsAlive ?? false) { Log.Info("Shutting down the console thread..." + $" ({stopwatch.ElapsedMilliseconds}ms)"); if (!ThreadConsole.Join(1000)) { try { ThreadConsole.Abort(); } catch (ThreadAbortException threadAbortException) { Log.Error(threadAbortException, $"{nameof(ThreadConsole)} aborted."); } } } if (ThreadLogic?.IsAlive ?? false) { Log.Info("Shutting down the logic thread..." + $" ({stopwatch.ElapsedMilliseconds}ms)"); if (!ThreadLogic.Join(10000)) { try { ThreadLogic.Abort(); } catch (ThreadAbortException threadAbortException) { Log.Error(threadAbortException, $"{nameof(ThreadLogic)} aborted."); } } } } Log.Info("Base dispose." + $" ({stopwatch.ElapsedMilliseconds}ms)"); base.Dispose(disposing); Log.Info("Finished disposing server context." + $" ({stopwatch.ElapsedMilliseconds}ms)"); Console.WriteLine(Strings.Commands.exited); }
/// <summary> /// Initialize WebSocket server with a given IP address and port number /// </summary> /// <param name="context">SSL context</param> /// <param name="address">IP address</param> /// <param name="port">Port number</param> public WebSocketSecureNetworkServer(SslNetworkContext context, IPAddress address, Int32 port) : base(context, address, port) { webSocketNetwork = new WebSocketNetwork(this); }
protected override void Dispose(bool disposing) { var stopwatch = new Stopwatch(); stopwatch.Start(); if (disposing) { #region CLEAN THIS UP // TODO: This may actually be fine here? Might want to move it into Bootstrapper though as "PrintShutdown()" Console.WriteLine(); Console.WriteLine(Strings.Commands.exiting); Console.WriteLine(); #if WEBSOCKETS Log.Info("Shutting down websockets..." + $" ({stopwatch.ElapsedMilliseconds}ms)"); WebSocketNetwork.Stop(); #endif // Except this line, this line is fine. Log.Info("Disposing network..." + $" ({stopwatch.ElapsedMilliseconds}ms)"); Network.Dispose(); // TODO: This probably also needs to not be a global, but will require more work to clean up. Log.Info("Saving online users/players..." + $" ({stopwatch.ElapsedMilliseconds}ms)"); var savingTasks = new List <Task>(); foreach (var user in Database.PlayerData.User.OnlineList.ToArray()) { savingTasks.Add(Task.Run(() => user.Save())); } Task.WaitAll(savingTasks.ToArray()); // TODO: This probably also needs to not be a global, but will require more work to clean up. Log.Info("Online users/players saved." + $" ({stopwatch.ElapsedMilliseconds}ms)"); //Disconnect All Clients //Will kill their packet handling threads so we have a clean shutdown lock (Globals.ClientLock) { var clients = Globals.Clients.ToArray(); foreach (var client in clients) { client.Disconnect("Server Shutdown", true); } } // TODO: This needs to not be a global. I'm also in the middle of rewriting the API anyway. Log.Info("Shutting down the API..." + $" ({stopwatch.ElapsedMilliseconds}ms)"); RestApi.Dispose(); #endregion if (ThreadConsole?.IsAlive ?? false) { Log.Info("Shutting down the console thread..." + $" ({stopwatch.ElapsedMilliseconds}ms)"); if (!ThreadConsole.Join(1000)) { try { ThreadConsole.Abort(); } catch (ThreadAbortException threadAbortException) { Log.Error(threadAbortException, $"{nameof( ThreadConsole )} aborted."); } } } if (ThreadLogic?.IsAlive ?? false) { Log.Info("Shutting down the logic thread..." + $" ({stopwatch.ElapsedMilliseconds}ms)"); if (!ThreadLogic.Join(10000)) { try { ThreadLogic.Abort(); } catch (ThreadAbortException threadAbortException) { Log.Error(threadAbortException, $"{nameof( ThreadLogic )} aborted."); } } } NetworkHelper.HandlerRegistry.Dispose(); } Log.Info("Base dispose." + $" ({stopwatch.ElapsedMilliseconds}ms)"); base.Dispose(disposing); Log.Info("Finished disposing server context." + $" ({stopwatch.ElapsedMilliseconds}ms)"); Console.WriteLine(Strings.Commands.exited); System.Environment.Exit(-1); }