using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using Foundation;
namespace com.hdl.on
{
public class Server
{
public static int Port=22222;
static System.Net.HttpListener listener;
///
/// 启动监听及处理
///
internal static void Start(System.Net.IPAddress ipAddress)
{
System.Threading.Tasks.Task.Run(() =>
{
try
{
if (listener == null)
{
listener = new System.Net.HttpListener();
listener.AuthenticationSchemes = System.Net.AuthenticationSchemes.Anonymous;
listener.Prefixes.Add(string.Format("http://{0}:{1}/", ipAddress.ToString(), Port));
listener.Start();
beginGetContext(listener);
System.Console.WriteLine("音乐服务启动成功!");
}
}
catch (Exception e)
{
System.Console.WriteLine("音乐服务启动失败!" + e.Message);
}
finally { }
});
}
internal static void Stop()
{
if (listener != null)
{
try
{
listener.Close();
}catch{}
}
listener = null;
System.Console.WriteLine("音乐服务停止!");
}
static string getTempPath()
{
var dirs = NSSearchPath.GetDirectories(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomain.User, true);
if (dirs == null || dirs.Length == 0)
{
return "";
}
return dirs[0];
}
///
/// 开始异步接收http请求
///
///
static void beginGetContext(System.Net.HttpListener listerner)
{
try
{
if (listerner == null || !listerner.IsListening)
{
return;
}
listerner.BeginGetContext(new System.AsyncCallback(getContextCallBack), null);
}
catch
{
System.Threading.Thread.Sleep(1);
beginGetContext(listerner);
}
}
///
/// 获取http请求,并处理
///
///
static void getContextCallBack(System.IAsyncResult ar)
{
beginGetContext(listener);
try
{
System.Net.HttpListenerContext context = listener.EndGetContext(ar);
manager(context);
}
catch { }
}
static void manager(System.Net.HttpListenerContext httpListenerContext)
{
System.Net.HttpListenerResponse httpListenerResponse = null;
try
{
#region
httpListenerResponse = httpListenerContext.Response;
httpListenerResponse.StatusCode = 200;//设置返回给客服端http状态代码
httpListenerResponse.ContentEncoding = System.Text.Encoding.UTF8;
var nameValueCollection = HttpUtility.ParseQueryString(System.IO.Path.GetFileName(httpListenerContext.Request.RawUrl));
if (0 < nameValueCollection.Count && System.IO.File.Exists($"{getTempPath()}/{nameValueCollection[0]}"))
{
var file = new System.IO.FileStream($"{getTempPath()}/{nameValueCollection[0]}", System.IO.FileMode.Open, System.IO.FileAccess.Read);
try
{
while (file.CanRead)
{
var bytes = new byte[1024];
var len = file.Read(bytes, 0, bytes.Length);
httpListenerResponse.OutputStream.Write(bytes, 0, len);
}
}
finally
{
file.Close();
}
}
httpListenerResponse.OutputStream.Flush();
#endregion
}
catch
{
}
finally
{
#region
try
{
httpListenerContext.Request.InputStream.Close();
}
catch { }
try
{
httpListenerResponse.OutputStream.Close();
}
catch { }
try
{
httpListenerResponse.Close();
}
catch { }
#endregion
}
}
}
}