//啟動一個監聽, 并綁定端口,MSDN有詳細參數說明
public bool StartListener(string[] prefixes)
{
bool isSuccess = false;
if (HttpListener.IsSupported)
{
HttpListener listener = new HttpListener();
foreach (string s in prefixes)
{
listener.Prefixes.Add(s);
}
listener.Start();
var result = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
isSuccess = true;
}
return isSuccess;
}
//關閉服務監聽
public void StopListener(){
if (listener != null)
{
if (listener.IsListening)
{
listener.Stop();
}
listener.Close();
}
}
//異步接收資料,并進行下一次的事件監聽
private void ListenerCallback(IAsyncResult result)
{
HttpListener listener = (HttpListener)result.AsyncState;
HttpListenerContext context = listener.EndGetContext(result);
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;
ContentType 根據選擇會自由傳回,也可以是Json
response.ContentType = "text/plain";
System.IO.Stream output = response.OutputStream;
string responseString = "true";
try
{
if (MessageAction != null)
{
System.IO.Stream inputStream = request.InputStream;
string resStr = string.Empty;
if (inputStream.CanRead)
{
byte[] bytes = new byte[request.ContentLength64];
int numBytesToRead = (int)request.ContentLength64;
inputStream.Read(bytes, 0, numBytesToRead);
inputStream.Close();
resStr = Encoding.UTF8.GetString(bytes);
}
MessageAction(resStr);
}
}
catch (Exception ex)
{
responseString = "false";
}
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
response.ContentLength64 = buffer.Length;
output.Write(buffer, 0, buffer.Length);
output.Close();
result = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
}
因為使用的是異步監聽,效率還是挺高的,延遲很短,能保證一個視覺上的系統執行。