HttpListener 实现web服务端
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);
}
} }
HttpListener 实现web服务端的更多相关文章
- 关于如何提高Web服务端并发效率的异步编程技术
最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...
- winform客户端利用webClient实现与Web服务端的数据传输
由于项目需要,最近研究了下WebClient的数据传输.关于WebClient介绍网上有很多详细介绍,大概就是利用WebClient可以实现对Internet资源的访问.无外乎客户端发送请求,服务端处 ...
- 如何提高Web服务端并发效率的异步编程技术
作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升 ...
- Web服务端性能提升实践
随着互联网的不断发展,日常生活中越来越多的需求通过网络来实现,从衣食住行到金融教育,从口袋到身份,人们无时无刻不依赖着网络,而且越来越多的人通过网络来完成自己的需求. 作为直接面对来自客户请求的Web ...
- Delphi XE5通过WebService开发Web服务端和手机客户端
Delphi XE5通过WebService开发Web服务端和手机客户端介绍 我们开发一个三层的android程序 建立一个webservices stand-alone vcl applicati ...
- wsgiref手写一个web服务端
''' 通过wsgiref写一个web服务端先讲讲wsgiref吧,基于网络通信其根本就是基于socket,所以wsgiref同样也是通过对socket进行封装,避免写过多的代码,将一系列的操作封装成 ...
- web服务端的架构演变
此文已由作者肖凡授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 最近Lofter项目碰到很多性能上的问题,特别是数据库相关的,每次推送后,告警就会第一时间到来.这些问题随着产 ...
- Rsync同步部署web服务端配置
Rsync同步部署web服务端配置 1,参数详解: -v, --verbose 详细模式输出. -q, --quiet 精简输出模式. -c, --checksum 打开校验开关,强制对文件传输进行校 ...
- Web服务端软件的服务品质概要
软件品质概述 提供同样功能.产品和服务的服务者中, 竞争力来自功能的多样化和服务品质的差异化, 无论是个体.企业还是国家. 这里的服务指功能.产品的实现程度和处理能力,以及研发/客服提供的技术支持程度 ...
随机推荐
- R语言——基本绘图函数
通过一个综合的例子测试绘图函数 学习的内容是tigerfish老师的教程. 第一节:基本知识 用seq函数产生100位学生的学号. > num = seq(,) > num [] [] [ ...
- java项目(java project)如何导入jar包的解决方案列表
右键项目-properties-java build path(左侧菜单)-选择libraries 有两种方式,导入jar包实际上就是建立一种链接,并不是copy式的导入 一.导入外部包,add ex ...
- c# 如何判断字符串中相同字符串的个数 (相同字符在字符串中出现的次数)
/// <summary> /// 计算字符串中子串出现的次数 /// </summary> /// <param name="str">字符串 ...
- C#入门经典(第三章-1)
#region--------#endregion 此关键字 将设置代码是否可以折叠和展开.但是他们不是C#关键字.注意:带#的是预处理指令,严格说不是C#关键字. 变量:
- jQuery常用及基础知识总结(二)
JQuery Effects 方法说明 show( ) 显示隐藏的匹配元素.show( speed, [callback] ) 以优雅的动画显示所有匹配的元素,并在显示完成后可选地触发一个回调函数.h ...
- Android Fragment 真正的完全解析(下)---转
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...
- Python+Selenium WebDriver API:浏览器及元素的常用函数及变量整理总结
由于网页自动化要操作浏览器以及浏览器页面元素,这里笔者就将浏览器及页面元素常用的函数及变量整理总结一下,以供读者在编写网页自动化测试时查阅. from selenium import webdrive ...
- DEDECMS模板中dede标签使用php和if判断语句的方法
先来看看下面这个标签{dede:field.tong_gg php=yes}if(@me==""||empty(@me))@me="<p>无</p> ...
- Struts2---OGNL表达式和EL表达式
在action里放入actioncontext的变量值 ActionContext.getContext().put("forumList", forumList); 在jsp里如 ...
- 用saxon框架对xml数据进行过滤 - 程序员的天堂 - ITeye技术网站
用saxon框架对xml数据进行过滤 博客分类: Java Saxon 是一个 XSLT 和XQuery处理器.它是使用 XML 文档和样式表作为输入,然后生成结果文档作为输出的程序,它还包括了一 ...