自己实现简单Web服务器,支持GET POST请求
最近项目上遇到一个需求,最后想到的解决方案是自己实现一个web服务器去处理请求,然后再将信息发送到另外一个程序。然后返回处理之后的结果呈现出来。
现在我就来分享一下如何实现的。
通过.NET 为我们提供的HttpListener类实现对Http协议的处理,实现简单的web服务器。
注意:此类在 .NET Framework 2.0 版中是新增的。所以支持.NET Framework 2.0以上版本。该类仅在运行 Windows XP SP2 或 Windows Server 2003 操作系统的计算机上可用。
引用命名空间:using System.Net;
使用Http服务一般步骤如下:
- 创建一个HTTP侦听器对象并初始化
- 开始侦听来自客户端的请求
- 处理客户端的Http请求
- 关闭HTTP侦听器
创建一个HTTP侦听器对象
创建HTTP侦听器对象只需要新建一个HttpListener对象即可。
HttpListener listener = new HttpListener();
初始化需要经过如下两步
- 添加需要监听的URL范围至listener.Prefixes中,可以通过如下函数实现:
listener.Prefixes.Add("http://127.0.0.1:8080/") //必须以'/'结尾多个的话可以采用循环添加。
- 调用listener.Start()实现端口的绑定,并开始监听客户端的需求。
侦听来自客户端的请求
这里有2种方式可以侦听HTTP请求,获取HttpListenerContext的最简单方式如下:
HttpListenerContext context = listener.GetContext();
该方法将阻塞调用函数至接收到一个客户端请求为止,如果要提高响应速度,可使用异步方法listener.BeginGetContext()来实现HttpListenerContext对象的获取。
我使用的是异步方式实现对HttpListenerContext对象的获取。
处理客户端的HTTP请求
获取HttpListenerContext后,可通过Request属性获取表示客户端请求的对象,通过Response属性取表示 HttpListener 将要发送到客户端的响应的对象。
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;
关闭HTTP侦听器
通过调用listener.Stop()函数即可关闭侦听器,并释放相关资源
实现GET POST请求处理
GET请求比较简单,直接通过 request.QueryString["linezero"]; QueryString就可以实现获取参数。
POST请求由于HttpListener 不提供实现,需要自己做处理。在下面相关代码中会贴出方法。
相关代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO; namespace WebConsole
{
class Program
{
static HttpListener sSocket;
static void Main(string[] args)
{
sSocket = new HttpListener();
sSocket.Prefixes.Add("http://127.0.0.1:8080/");
sSocket.Start();
sSocket.BeginGetContext(new AsyncCallback(GetContextCallBack), sSocket);
Console.WriteLine("已启动监听,访问http://127.0.0.1:8080/");
Console.ReadKey();
} static void GetContextCallBack(IAsyncResult ar)
{
try
{
sSocket = ar.AsyncState as HttpListener;
HttpListenerContext context = sSocket.EndGetContext(ar);
//再次监听请求
sSocket.BeginGetContext(new AsyncCallback(GetContextCallBack), sSocket);
//处理请求
string a = Request(context.Request);
//输出请求
Response(context.Response, a);
}
catch { }
} /// <summary>
/// 处理输入参数
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
static string Request(HttpListenerRequest request)
{
string temp = "welcome to linezero!";
if (request.HttpMethod.ToLower().Equals("get"))
{
//GET请求处理
if (!string.IsNullOrEmpty(request.QueryString["linezero"]))
temp = request.QueryString["linezero"];
}
else if (request.HttpMethod.ToLower().Equals("post"))
{
//这是在POST请求时必须传参的判断默认注释掉
//if (!request.HasEntityBody)
//{
// temp = "请传入参数";
// return temp;
//}
//POST请求处理
Stream SourceStream = request.InputStream;
byte[] currentChunk = ReadLineAsBytes(SourceStream);
//获取数据中有空白符需要去掉,输出的就是post请求的参数字符串 如:username=linezero
temp = Encoding.Default.GetString(currentChunk).Replace("", "");
}
return temp;
} static byte[] ReadLineAsBytes(Stream SourceStream)
{
var resultStream = new MemoryStream();
while (true)
{
int data = SourceStream.ReadByte();
resultStream.WriteByte((byte)data);
if (data <= )
break;
}
resultStream.Position = ;
byte[] dataBytes = new byte[resultStream.Length];
resultStream.Read(dataBytes, , dataBytes.Length);
return dataBytes;
} /// <summary>
/// 输出方法
/// </summary>
/// <param name="response">response对象</param>
/// <param name="responseString">输出值</param>
/// <param name="contenttype">输出类型默认为json</param>
static void Response(HttpListenerResponse response, string responsestring, string contenttype = "application/json")
{
response.StatusCode = ;
response.ContentType = contenttype;
response.ContentEncoding = Encoding.UTF8;
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responsestring);
//对客户端输出相应信息.
response.ContentLength64 = buffer.Length;
System.IO.Stream output = response.OutputStream;
output.Write(buffer, , buffer.Length);
//关闭输出流,释放相应资源
output.Close();
}
}
}
最后启动程序,在地址栏里输入http://127.0.0.1:8080 就可以访问了。
如果你觉得本文对你有帮助,请点击“推荐”,谢谢。
自己实现简单Web服务器,支持GET POST请求的更多相关文章
- 一个简单的Web服务器-支持静态资源请求
目标 实现一个简单的Web服务器,能够根据HTTP请求的URL响应对应的静态资源,如果静态资源不存在则响应404. HttpServer 使用ServerSocket实现的一个服务器,request根 ...
- 一个简单的Web服务器-支持Servlet请求
上接 一个简单的Web服务器-支持静态资源请求,这个服务器可以处理静态资源的请求,那么如何处理Servlet请求的呢? 判断是否是Servlet请求 首先Web服务器需要判断当前请求是否是Servle ...
- Socket网络编程--简单Web服务器(1)
这一次的Socket系列准备讲Web服务器.就是编写一个简单的Web服务器,具体怎么做呢?我也不是很清楚流程,所以我找来了一个开源的小的Web服务器--tinyhttpd.这个服务器才500多行的代码 ...
- Java 18 新特性:简单Web服务器 jwebserver
在今年3月下旬的时候,Java版本已经更新到了18.接下来DD计划持续做一个系列,主要更新从Java 9开始的各种更新内容,但我不全部都介绍,主要挑一些有意思的内容,以文章和视频的方式来给大家介绍和学 ...
- C#中使用Socket实现简单Web服务器
上一篇博客中介绍了怎样使用socket访问web服务器.关键有两个: 熟悉Socket编程: 熟悉HTTP协议. 上一篇主要是通过socket来模拟浏览器向(任何)Web服务器发送(HTTP)请求,重 ...
- tomcat解析之简单web服务器(图)
链接地址:http://gogole.iteye.com/blog/587163 之前有javaeyer推荐了一本书<how tomcat works>,今天晚上看了看,确实不错,第一眼就 ...
- Socket网络编程--简单Web服务器(6)
本来是想实现ssl连接的,但是弄了好久都不成功,就索性不做了,等以后有能力再做了.所以这一小节就是本次的最后一节了.就简单的说几个注意点. 1.加个配置文件 使用单例模式,使用一个类,该类保存一些信息 ...
- Socket网络编程--简单Web服务器(4)
上一小节已经实现了对图片的传输,接下来就是判断文件是否为js,css,png等格式.我们增加一个函数用于判断格式 int WebServer::get_filetype(char *type,char ...
- Socket网络编程--简单Web服务器(5)
这一小节我们将实现服务器对get和post的请求进行对cgi程序的调用.对于web服务器以前的章节已经实现了对get和post请求的调用接口,接下来给出对应接口的实现. int WebServer:: ...
随机推荐
- swift 项目 oc 和 swift 混用,文件相互引用
创建swift工程后,如果后面想新建 oc 文件,这时会生成一个 AppName-Bridging-Header.h文件 一,在swift 文件中 1> 引用swift 文件 什么都不需要操作 ...
- PHP标准库 (SPL) 笔记
简介 SPL是Standard PHP Library(PHP标准库)的缩写. The Standard PHP Library (SPL) is a collection of interfaces ...
- Atitti 图像处理 图像混合 图像叠加 blend 原理与实现
Atitti 图像处理 图像混合 图像叠加 blend 原理与实现 混合模式 编辑 本词条缺少信息栏,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 混合模式是图像处理技术中的一个技术名词,不 ...
- 事件异步(EAP)使用事件异步处理一些耗时操作
比如需要下载一些比较大的文件,如果使用会UI卡顿,使用异步可以节省一些时间 下面是一些例子: using System; using System.Collections.Generic; using ...
- C#与JS实现 获取指定字节长度 中英文混合字符串 的方法
平时在作数据库插入操作时,如果用 INSERT 语句向一个varchar型字段插入内容时,有时会因为插入的内容长度超出规定的长度而报错. 尤其是插入中英文混合字符串时,SQL Server中一般中文要 ...
- hibernate(九) 二级缓存和事务级别详讲
序言 这算是hibernate的最后一篇文章了,下一系列会讲解Struts2的东西,然后说完Struts2,在到Spring,然后在写一个SSH如何整合的案例.之后就会在去讲SSM,在之后我自己的个人 ...
- python导入模块和包的使用
做项目的时候经常会要求做到模块化管理,即同样功能的代码放到同一个文件夹下,以便于方便管理,相信很多人对模块的引用都模糊不清,今天鄙人在这里就总结下. 一.模块导入的使用 在同一个文件夹下有两个文件分别 ...
- WPF中实现验证码功能
其实和winform中的实现差不多,只是由于WPF中控件使用的库与winform中的有区别,大体上还是差不多的,直接看代码: 产生验证码的类:ValidCode.cs public class Val ...
- mongodb php
首先安装扩展,然后才能使用mongodb 一.连接数据库 try { $mongo = new MongoClient(); $db = $mongo->mydb; var_dump($db); ...
- 国内第一部C#.Net调用Matlab混合编程视频教程
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录:[目录]Matlab和C#混合编程文章目录 一.视频说明 2014年的5.1,我将这套视频教 ...