1.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;
using System.IO; namespace HttpListen
{
class Program
{
static void Main(string[] args)
{
string[] arr = { "http://localhost:37090/", "http://zhihu.org.cn/a/" };
// SimpleListenerExample(arr);
// test1(arr[1]);
HttpServer httpServer;
//if (args.GetLength(0) > 0)
//{
//httpServer = new MyHttpServer(Convert.ToInt16(args[0]));
httpServer = new MyHttpServer(2345);
//} else {
// httpServer = new MyHttpServer(8080);
//}
Thread thread = new Thread(new ThreadStart(httpServer.listen));
thread.Start(); } //方法1
// This example requires the System and System.Net namespaces.
public static void SimpleListenerExample(string[] prefixes)
{
if (!HttpListener.IsSupported)
{
Console.WriteLine("Windows XP SP2 or Server 2003 is required to use the HttpListener class.");
return;
}
// URI prefixes are required,
// for example "http://contoso.com:8080/index/".
if (prefixes == null || prefixes.Length == 0)
throw new ArgumentException("prefixes"); // Create a listener.
HttpListener listener = new HttpListener();
// Add the prefixes.
foreach (string s in prefixes)
{
listener.Prefixes.Add(s);
}
listener.Start();
Console.WriteLine("Listening..."); Task.Factory.StartNew(() =>
{ // Note: The GetContext method blocks while waiting for a request.
HttpListenerContext context = listener.GetContext();
HttpListenerRequest request = context.Request;
// Obtain a response object.
HttpListenerResponse response = context.Response;
// Construct a response.
string responseString = "<HTML><BODY> Hello world!</BODY></HTML>";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
// Get a response stream and write the response to it.
response.ContentLength64 = buffer.Length;
System.IO.Stream output = response.OutputStream;
output.Write(buffer, 0, buffer.Length);
// You must close the output stream.
output.Close();
// listener.Stop(); }); Console.WriteLine("ok");
Console.ReadLine();
} //方法2
public static void test1(string url)
{
HttpListener httpListener = new HttpListener(); httpListener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
httpListener.Prefixes.Add(url);
Console.WriteLine("开始监听··········");
httpListener.Start();
new Thread(new ThreadStart(delegate
{
while (true)
{ HttpListenerContext httpListenerContext = httpListener.GetContext();
httpListenerContext.Response.StatusCode = 200;
using (StreamWriter writer = new StreamWriter(httpListenerContext.Response.OutputStream))
{
writer.WriteLine("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/><title>测试服务器</title></head><body>");
writer.WriteLine("<div style=\"height:20px;color:blue;text-align:center;\"><p> hello</p></div>");
writer.WriteLine("<ul>");
writer.WriteLine("</ul>");
writer.WriteLine("</body></html>"); } }
})).Start(); } } }

方法3类文件:

using System;
using System.Collections;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading; // offered to the public domain for any use with no restriction
// and also with no warranty of any kind, please enjoy. - David Jeske. // simple HTTP explanation
// http://www.jmarshall.com/easy/http/ namespace HttpListen
{ public class HttpProcessor
{
public TcpClient socket;
public HttpServer srv; private StreamReader inputStream;
public StreamWriter outputStream; public String http_method;
public String http_url;
public String http_protocol_versionstring;
public Hashtable httpHeaders = new Hashtable(); private static int MAX_POST_SIZE = * * ; // 10MB public HttpProcessor(TcpClient s, HttpServer srv)
{
this.socket = s;
this.srv = srv;
} public void process()
{
// bs = new BufferedStream(s.GetStream());
inputStream = new StreamReader(socket.GetStream());
outputStream = new StreamWriter(new BufferedStream(socket.GetStream()));
try
{
parseRequest();
readHeaders();
if (http_method.Equals("GET"))
{
handleGETRequest();
}
else if (http_method.Equals("POST"))
{
handlePOSTRequest();
}
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.ToString());
writeFailure();
}
outputStream.Flush();
// bs.Flush(); // flush any remaining output
inputStream = null; outputStream = null; // bs = null;
socket.Close();
} public void parseRequest()
{
String request = inputStream.ReadLine();
string[] tokens = request.Split(' ');
if (tokens.Length != )
{
throw new Exception("invalid http request line");
}
http_method = tokens[].ToUpper();
http_url = tokens[];
http_protocol_versionstring = tokens[]; Console.WriteLine("starting: " + request);
} public void readHeaders()
{
Console.WriteLine("readHeaders()");
String line;
while ((line = inputStream.ReadLine()) != null)
{
if (line.Equals(""))
{
Console.WriteLine("got headers");
return;
} int separator = line.IndexOf(':');
if (separator == -)
{
throw new Exception("invalid http header line: " + line);
}
String name = line.Substring(, separator);
int pos = separator + ;
while ((pos < line.Length) && (line[pos] == ' '))
{
pos++; // strip any spaces
} string value = line.Substring(pos, line.Length - pos);
Console.WriteLine("header: {0}:{1}", name, value);
httpHeaders[name] = value;
}
} public void handleGETRequest()
{
srv.handleGETRequest(this);
} public void handlePOSTRequest()
{
// this post data processing just reads everything into a memory stream.
// this is fine for smallish things, but for large stuff we should really
// hand an input stream to the request processor. However, the input stream
// we hand him needs to let him see the "end of the stream" at this content
// length, because otherwise he won't know when he's seen it all! Console.WriteLine("get post data start");
int content_len = ;
MemoryStream ms = new MemoryStream();
if (this.httpHeaders.ContainsKey("Content-Length"))
{
content_len = Convert.ToInt32(this.httpHeaders["Content-Length"]);
if (content_len > MAX_POST_SIZE)
{
throw new Exception(
String.Format("POST Content-Length({0}) too big for this simple server",
content_len));
}
byte[] buf = new byte[];
int to_read = content_len;
while (to_read > )
{
int numread = this.inputStream.BaseStream.Read(buf, , Math.Min(, to_read));
to_read -= numread;
ms.Write(buf, , numread);
}
ms.Seek(, SeekOrigin.Begin);
}
Console.WriteLine("get post data end");
srv.handlePOSTRequest(this, new StreamReader(ms)); } public void writeSuccess()
{
outputStream.Write("HTTP/1.0 200 OK\n");
outputStream.Write("Content-Type: text/html\n");
outputStream.Write("Connection: close\n");
outputStream.Write("\n");
} public void writeFailure()
{
outputStream.Write("HTTP/1.0 404 File not found\n");
outputStream.Write("Connection: close\n");
outputStream.Write("\n");
}
} public abstract class HttpServer
{ protected int port;
TcpListener listener;
bool is_active = true; public HttpServer(int port)
{
this.port = port;
} public void listen()
{
listener = new TcpListener(IPAddress.Parse("127.0.0.1"), port);
listener.Start();
while (is_active)
{
TcpClient s = listener.AcceptTcpClient();
HttpProcessor processor = new HttpProcessor(s, this);
Thread thread = new Thread(new ThreadStart(processor.process));
thread.Start();
Thread.Sleep();
}
} public abstract void handleGETRequest(HttpProcessor p);
public abstract void handlePOSTRequest(HttpProcessor p, StreamReader inputData);
} public class MyHttpServer : HttpServer
{
public MyHttpServer(int port)
: base(port)
{
}
public override void handleGETRequest(HttpProcessor p)
{
Console.WriteLine("request: {0}", p.http_url);
p.writeSuccess();
p.outputStream.WriteLine("<html><body><h1>test server</h1>");
p.outputStream.WriteLine("Current Time: " + DateTime.Now.ToString());
p.outputStream.WriteLine("url : {0}", p.http_url); p.outputStream.WriteLine("<form method=post action=/form>");
p.outputStream.WriteLine("<input type=text name=foo value=foovalue>");
p.outputStream.WriteLine("<input type=submit name=bar value=barvalue>");
p.outputStream.WriteLine("</form>");
} public override void handlePOSTRequest(HttpProcessor p, StreamReader inputData)
{
Console.WriteLine("POST request: {0}", p.http_url);
string data = inputData.ReadToEnd(); p.outputStream.WriteLine("<html><body><h1>test server</h1>");
p.outputStream.WriteLine("<a href=/test>return</a><p>");
p.outputStream.WriteLine("postbody: <pre>{0}</pre>", data);
}
} }

最新文章

  1. How to accept Track changes in Microsoft Word 2010?
  2. 取消ie浏览器edge浏览器输入框右边的叉和眼睛
  3. A.Kaw矩阵代数初步学习笔记 5. System of Equations
  4. 07socket编程
  5. IOS仿Android九宫格解锁效果[转]
  6. SQL对字符串进行排序
  7. 十六、C# 常用集合类及构建自定义集合(使用迭代器)
  8. web项目的两个创建形式website和webapplication
  9. (15)Visual Studio中使用PCL项目加入WCF WebService参考
  10. float 浮点数与零值0比较大小
  11. Linux Bash Shell入门教程
  12. 使Asp.net Core同时支持输出Json/Xml
  13. JGUI源码:实现日期控件显示(17)
  14. WARN PageNotFound:208 - Request method &#39;POST&#39; not supported
  15. 深深感受 Promise.all 带来的速度提升
  16. 如何让win2008服务器显示中文无乱码
  17. MYSQL根据字段名查询所属表
  18. WPF popup被截断的原因和修改方法
  19. day5模块学习 -- time、datetime时间模块
  20. java stream collector

热门文章

  1. 我终于有案例库啦(github 提供的)
  2. windows加固方案
  3. kill -QUIT &lt;pid&gt;
  4. 手机电话号码吉凶查询原理及ASP算法源码 转
  5. iOS之tabbar图片去除渲染以及字体颜色统一配置
  6. css预处理器
  7. [Java]读取文件方法大全(转)
  8. HDU 1887 Weird Numbers(负数的进制转化)
  9. UVA 10304 Optimal Binary Search Tree
  10. JS检测图片的大小