public void Stop() { _web.Close(); Broadcaster.Stop(); _tsPool.ForEach(stream => stream.Disconnect()); _tsPool.Clear(); Device.Stop(); }
static void StopServer() { server.Close(); server = null; App.serverRunning = false; GC.Collect(); }
/// <summary> /// Connects to the webserver /// </summary> /// <returns>A Task representing the process</returns> public async Task ConnectToWebserver() { //If the connection is alive, close it if (WebServer != null) { if (WebServer.IsAlive) { WebServer.Close(Network.Enums.CloseReason.ServerClosed, false); } } //Initiate youtubedl await Downloader.Init(); //Connect to webserver ConLog.Log("WebMedia Link", "Connecting to WebMediaLink server", LogType.Info); Tuple <TcpConnection, ConnectionResult> result = await ConnectionFactory.CreateTcpConnectionAsync(WebserverIp, WebserverPort); //Check if connection worked if (result.Item2 != ConnectionResult.Connected) { ConLog.Log("WebMedia Link", "Failed to connect to WebMediaLink server", LogType.Error); await Disconnected(Network.Enums.CloseReason.Timeout, result.Item1); } WebServer = result.Item1; ConLog.Log("WebMedia Link", "Connected to WebMediaLink server", LogType.Ok); //Register cancel token triggered CancelToken.Register(() => { if (WebServer != null) { if (WebServer.IsAlive) { WebServer.Close(Network.Enums.CloseReason.ServerClosed, false); } } }); //Register connection lost handler WebServer.ConnectionClosed += async(reason, connection) => await Disconnected(reason, connection); //Register packet handlers WebServer.RegisterPacketHandler <GetInfoRequest>(GetInfoRequestReceived, this); WebServer.RegisterRawDataHandler("Download", async(rawData, connection) => await DownloadFromRequest(rawData, connection)); }
protected override void Worker() { if (LogConsole != null) { LogConsole.ExceptionMode = LogExceptionMode.Full; LogConsole.Flags |= LogConsoleFlags.DisplayTimeStamp; LogConsole.Mode = LogReceiverMode.Opportune; } Logger.DebugReceiver?.Close(); //init the async mysql connection class we want to use. //new MySql.Data.MySqlClient.MySqlConnection().Dispose(); WebServer webServer = null; FtpServer ftpServer = null; MusicDataBase mdb = null; MDBBroadcaster broadcaster = null; DesktopPlayer player = null; try { var rootFolder = FileSystem.ProgramDirectory; webServer = new WebServer(); mdb = new MusicDataBase(rootFolder); if (LogSystem != null) { //allow user to override loglevel by commandline if (LogSystem.Level == LogLevel.Information) { LogSystem.Level = mdb.Config.ReadEnum <LogLevel>("MusicDataBase", "LogLevel", LogLevel.Information); } } this.LogInfo("Loading Database..."); mdb.Load(); MemoryStorage.Default.LogVerboseMessages = LogSystem?.Level == LogLevel.Verbose; if (null != mdb.Database) { mdb.Database.Storage.LogVerboseMessages = MemoryStorage.Default.LogVerboseMessages; } if (mdb.Config.ReadBool("MusicDataBase", "ClearDatabase", false)) { foreach (ITable t in mdb.Tables) { t.Clear(); } } mdb.Save(); this.LogInfo("Loading auth tables..."); if (mdb.Database != null) { webServer.AuthTables.Connect(TableConnectorMode.Direct, mdb.Database); } else { try { webServer.AuthTables.Load(mdb.DataBasePath); } catch (Exception ex) { this.LogWarning(ex, "Load auth tables failed. Recreating..."); } } authTables = webServer.AuthTables; var authInterface = new AuthInterface <MDBUserLevel>(webServer); { //auth interface User admin = webServer.AuthTables.CheckAdminPresent(); if (mdb.Config.ReadBool("MusicDataBase", "LocalhostIsAdmin", false)) { authInterface.DefaultLocalhostUser = admin; } } this.LogInfo("Initializing FtpServer..."); ftpServer = new FtpServer(); ftpServer.CheckLogin += this.FtpServerCheckLogin; //add music dirs to ftp server SetFtpMusicFolders(mdb, ftpServer); int ftpPort = mdb.Config.ReadInt32("FtpServer", "Port", 8021); ftpServer.Listen(ftpPort); player = new DesktopPlayer(mdb, (long)MDBStreamType.JukeBob); player.Start(); this.LogInfo("Initializing WebServer..."); webServer.SessionMode = WebServerSessionMode.Cookie; webServer.SessionTimeout = TimeSpan.FromDays(1); webServer.PerformanceChecks = mdb.Config.ReadBool("WebServer", "PerformanceChecks", false); webServer.EnableExplain = mdb.Config.ReadBool("WebServer", "Explain", false); webServer.TransmitLayout = false; webServer.EnableTemplates = true; webServer.CheckAccess += WebServerCheckAccess; webServer.StaticFilesPath = mdb.WebFolder; //prepare rpc var avatarFolder = mdb.GetFolderConfig("MusicDataBase", "AvatarFolder", "avatar"); webServer.Register(new AvatarInterface(avatarFolder)); webServer.Register(authInterface); var webInterface = new WebInterface(mdb, webServer.AuthTables, player); webInterface.LogCollector.Level = LogLevel.Debug; webInterface.LogCollector.MaximumItemCount = 1000; webInterface.LogCollector.ExceptionMode = LogExceptionMode.Full; webServer.Register(webInterface); webServer.Register(new HostInterface(this)); //start server int webPort = mdb.Config.ReadInt32("WebServer", "Port", 8080); webServer.Listen(webPort); mdb.SetHostConfiguration(Environment.UserName + "." + Environment.MachineName, webPort, ftpPort, mdb.GetLocalAddresses()); //using (Streamer streamer = new Streamer(mdb, MDBStreamType.JukeBox)) broadcaster = new MDBBroadcaster(mdb); broadcaster.Start(); if (mdb.Config.ReadBool("Crawler", "RunAtStartup", false)) { webInterface.FileCrawler.Start(); } //main loop this.LogNotice("Entering main loop..."); while (!ServiceParameters.Shutdown) { ServiceParameters.WaitForShutdown(1000); //SetConsoleTitle(); } } finally { //cleanup broadcaster?.Dispose(); ftpServer?.Close(); player?.Stop(); player?.Dispose(); authTables?.Save(); authTables = null; mdb?.Save(); webServer?.Close(); } this.LogInfo("Shutdown completed."); Logger.Flush(); }