Advertisement
Guest User

Untitled

a guest
Jun 26th, 2021
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.80 KB | None | 0 0
  1.  public class Server
  2.     {
  3.         private readonly string _serverAddress;
  4.         private CancellationTokenSource _cancellationTokenSource;
  5.         private Task _acceptClientsTask;
  6.         private Task _readCommandTask;
  7.         private StringBuilder _buffer = new();
  8.         private readonly object _bufferLocker = new();
  9.  
  10.         public Server(string serverAddress)
  11.         {
  12.             _serverAddress = serverAddress ?? "localhost";
  13.         }
  14.  
  15.         public Task Start()
  16.         {
  17.             ResetCancellationToken();
  18.             _acceptClientsTask = StartAcceptClients();
  19.             _readCommandTask = ReadCommands();
  20.             return Task.WhenAll(_acceptClientsTask, _readCommandTask);
  21.         }
  22.         public void Stop() => _cancellationTokenSource?.Cancel();
  23.  
  24.         private async Task StartAcceptClients()
  25.         {
  26.             CancellationToken stopToken = _cancellationTokenSource.Token;
  27.  
  28.             HttpListener server = new HttpListener();
  29.             server.Prefixes.Add($"http://{_serverAddress}:8833/rcon/");
  30.  
  31.             if (stopToken.IsCancellationRequested)
  32.                 return;
  33.  
  34.             server.Start();
  35.  
  36.             while (!stopToken.IsCancellationRequested)
  37.             {
  38.  
  39.                 HttpListenerContext context = await server.GetContextAsync();
  40.                 HttpListenerRequest request = context.Request;
  41.                 HttpListenerResponse response = context.Response;
  42.  
  43.                 string url = HttpUtility.UrlDecode(request.RawUrl);
  44.                 if (url.Length > 8)
  45.                 {
  46.                     Console.WriteLine(url.Substring(8));
  47.                 }
  48.  
  49.                 byte[] responceBytes = Encoding.UTF8.GetBytes(_buffer.ToString());
  50.                 response.ContentLength64 = responceBytes.Length;
  51.  
  52.                 Stream output = response.OutputStream;
  53.                 await output.WriteAsync(responceBytes, 0, responceBytes.Length);
  54.  
  55.                 lock(_bufferLocker)
  56.                 {
  57.                     _buffer.Clear();
  58.                 }
  59.  
  60.                 output.Close();
  61.             }
  62.             server.Stop();
  63.         }
  64.  
  65.         private async Task ReadCommands()
  66.         {
  67.             var token = _cancellationTokenSource.Token;
  68.             var consoleStream = Console.In;
  69.             while (!token.IsCancellationRequested)
  70.             {
  71.                 var toAppend = await consoleStream.ReadLineAsync();
  72.                
  73.                 lock(_bufferLocker)
  74.                 {
  75.                     _buffer.Append(toAppend);
  76.                 }
  77.             }
  78.         }
  79.  
  80.         private void ResetCancellationToken()
  81.         {
  82.             _cancellationTokenSource?.Cancel();
  83.             _cancellationTokenSource?.Dispose();
  84.             _cancellationTokenSource = new CancellationTokenSource();
  85.         }
  86.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement