自己实现简单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:: ...
随机推荐
- AtomineerUtils爆破过程记录
AtomineerUtils是国外的一款用于生成源代码注释的一款VS插件,官方网站:http://www.atomineerutils.com/products.php 通过链接,可以看出这款插件的功 ...
- .NET中Dictionary<TKey, TValue>浅析
.NET中Dictionary<TKey, Tvalue>是非常常用的key-value的数据结构,也就是其实就是传说中的哈希表..NET中还有一个叫做Hashtable的类型,两个类型都 ...
- cocoapods 更新
sudo gem update --system sudo gem install cocoapods pod setup pod --version
- Java基础之I/O和file
五.IO流1.IO流概述 (1)用来处理设备(硬盘,控制台,内存)间的数据. (2)java中对数据的操作都是通过流的方式. (3)java用于操作流的类都在io包中. (4)按照流操作的数据的类型不 ...
- Excel快速改变行列的次序
改变行列次序是在Excel中常常需要进行的操作,多数用户的方法是先剪切要调整的行或列,然后选定目标位置,单击菜单“插入”→“剪切单元格”. 事实上,使用键盘来配合的话,改变行列的次序可以更快捷.比 ...
- 题目一:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
- 每天一个linux命令(35):ln 命令
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在 ...
- 每天一个linux命令(21):find命令之xargs
在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出 ...
- 数组的一个强大函数splice,[增,删,改]
// var a = [1,2,3]; // a.splice(0); // console.log(a); >>[] // a.splice(1); // console.log(a); ...
- Windows 系统下Git安装图解
简单来说Git是一个免费的.开源的版本控制软件,从功能上讲,跟我们比较熟悉的Subversion(SVN)这类版本控制软件没什么两样.由于工作的需求,需要在WinXP下安装git配合团队完成相应的工作 ...