You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.1 KiB
88 lines
2.1 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Threading;
|
|
using System.Net;
|
|
|
|
namespace Apewer.Network
|
|
{
|
|
|
|
/// <summary></summary>
|
|
public class HttpServer
|
|
{
|
|
|
|
private HttpListener _listener;
|
|
private Thread _thread;
|
|
private int _port = 80;
|
|
|
|
/// <summary></summary>
|
|
public Action<HttpListenerContext> Action { get; set; }
|
|
|
|
/// <summary></summary>
|
|
public int Port
|
|
{
|
|
get { return _port; }
|
|
set { _port = Math.Max(ushort.MinValue, Math.Min(ushort.MaxValue, value)); }
|
|
}
|
|
|
|
/// <summary></summary>
|
|
public Exception Start(int port)
|
|
{
|
|
_listener = new HttpListener();
|
|
try
|
|
{
|
|
_listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
|
|
_listener.Prefixes.Add("http://0.0.0.0:" + port.ToString() + "/");
|
|
_listener.Start();
|
|
|
|
_thread = new Thread(Listen);
|
|
_thread.IsBackground = true;
|
|
_thread.Start();
|
|
|
|
return null;
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
return e;
|
|
}
|
|
}
|
|
|
|
/// <summary></summary>
|
|
public void Stop()
|
|
{
|
|
if (_thread != null)
|
|
{
|
|
_thread.Abort();
|
|
_thread = null;
|
|
}
|
|
|
|
if (_listener != null)
|
|
{
|
|
_listener.Close();
|
|
_listener.Stop();
|
|
_listener = null;
|
|
}
|
|
}
|
|
|
|
private void Listen()
|
|
{
|
|
while (true)
|
|
{
|
|
if (_listener == null) break;
|
|
|
|
var context = _listener.GetContext();
|
|
var thread = new Thread((obj) =>
|
|
{
|
|
try { Action?.Invoke(context); }
|
|
catch (Exception e) { var __e = e; }
|
|
})
|
|
{
|
|
IsBackground = true
|
|
};
|
|
thread.Start(context);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|