在上一篇博文中介绍的Web Server,其实是Socket编程应用,我们这篇文章介绍的是真正的Http Server,支持GET和POST功能。
同样我们还是在官方示例Http Server上进行修改,为了使示例更清晰,我们尽可能把代码做的更简单一些。
主程序直接修改为如下代码:
public static void Main()
{
try
{
RunServer("http");
}
catch (Exception e)
{
Debug.Print(e.Message);
}
}
核心代码就是对GET和POST请求的支持,这里我们不要变,代码如下:
internal static void RunServer(string prefix)
{
HttpListener listener = new HttpListener(prefix, -1);
listener.Start();
while (true)
{
HttpListenerResponse response = null;
HttpListenerContext context = null;
try
{
context = listener.GetContext();
response = context.Response;
HttpListenerRequest request = context.Request;
switch (request.HttpMethod.ToUpper())
{
case "GET": GetRequest(context); break;
case "POST": PostRequest(context); break;
}
if (response != null)
{
response.Close();
}
}
catch
{
if (context != null)
{
context.Close();
}
}
}
}
GET 请求处理代码如下,我们进行了大幅度的简化和调整,并且增加了一个upload.asp处理模块,代码如下:
private static void GetRequest(HttpListenerContext context)
{
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;
string strFilePath = GetPathFromURL(request.RawUrl);
Debug.Print(strFilePath);
response.StatusCode = (int)HttpStatusCode.OK;
// Start HTML document
string strResp = "<HTML><BODY>.Net Micro Framework Example HTTP Server<p>";
// Print requested verb, URL and version.. Adds information from the request.
strResp += "HTTP Method: " + request.HttpMethod + "<br> Requested URL: \"" + request.RawUrl +
"\"<br> HTTP Version: " + request.ProtocolVersion + "\"<p>";
if (strFilePath.ToLower() == "\\upload.asp")
{
strResp += Resource1.GetString(Resource1.StringResources.PostForm);
}
else
{
strResp += "File to access " + strFilePath + "<p>";
strResp += "Directory: \"" + strFilePath + "\" Does not exists";
}
// Closes HTML
strResp += "</BODY></HTML>";
// Sends it.
byte[] messageBody = Encoding.UTF8.GetBytes(strResp);
response.ContentType = "text/html";
response.OutputStream.Write(messageBody, 0, messageBody.Length);
}
POST处理部分,我们也进行了简化,不过变化不大,相关代码如下:
private static void PostRequest(HttpListenerContext context)
{
// Retrieves request and response.
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;
// Allocates buffer for reading of message body
byte[] postdata = new byte[BUFFER_SIZE];
// Now reads the posted data. The content length should be supplied.
// It is error not to have content length with post request.
if (request.ContentLength64 > 0)
{
Debug.Print("Request Headers:");
Debug.Print(request.Headers.ToString());
long totalBytesReceived = 0;
long contLen = request.ContentLength64;
while (totalBytesReceived < contLen)
{
int bytesToRead = (int)(contLen - totalBytesReceived);
// Limit to buffer size
bytesToRead = bytesToRead < BUFFER_SIZE ? bytesToRead : BUFFER_SIZE;
int dataRead = request.InputStream.Read(postdata, 0, bytesToRead);
if (dataRead == 0)
{
// Definitely some error. Means file incomplete.
break;
}
totalBytesReceived += dataRead;
};
// Sends response:
string strResp = "<HTML><BODY>.Net Micro Framework Example HTTP Server<p>";
// Print requested verb, URL and version.. Adds information from the request.
strResp += "HTTP Method: " + request.HttpMethod + "<br> Requested URL: \"" + request.RawUrl +
"\"<br> HTTP Version: " + request.ProtocolVersion + "\"<p>";
strResp += "Amount of data received in message body: " + totalBytesReceived + "<br>";
strResp += "Data of message body is discarded (if there is no filesystem). Please review HTTP Server sample code to add processing of data";
strResp += "</BODY></HTML>";
response.StatusCode = (int)HttpStatusCode.OK;
byte[] messageBody = Encoding.UTF8.GetBytes(strResp);
response.ContentType = "text/html";
response.OutputStream.Write(messageBody, 0, messageBody.Length);
}
else // Content length is missing, send error back
{
// Sends response:
string strResp = "<HTML><BODY>Content length is missing in Post request</BODY></HTML>";
byte[] messageBody = Encoding.UTF8.GetBytes(strResp);
response.ContentType = "text/html";
response.OutputStream.Write(messageBody, 0, messageBody.Length);
}
}
好了,程序编写好后,直接部署到开发板上进行运行,连接PC,打开IE 浏览器,输入http://192.168.0.100/a.txt,效果如下:
本意是如果存在a.txt文件,则下载a.txt的内容,不过我们在代码中没有处理。
下面演示一下POST的使用,在IE浏览器中输入:http://192.168.0.100/Upload.asp
IE显示的内容如下:
我们随意选择一个文件,然后单击 【Send File Data To Server】按钮,则Http Server处理POST请求,并返回,IE此时会新弹出一个页面,如下图:
在Http Server 的POST处理程序内,我们可以获取上传文件的内容,这里我们没有显示相关内容,只是显示了它的大小,如611个字节。
.NET Micro Framework支持的网络功能还很多,如对WCF的支持,有待我们今后细细研究。
-----------------------------------------------------------------------------------------------------------------------
源码/文档:http://www.sky-walker.com.cn/MFRelease/Sample/YFHttpServer.rar
MF论坛:http://space.cnblogs.com/group/MFSoft/
MF开发板:http://item.taobao.com/item.htm?id=7117999726
网络开发板:http://item.taobao.com/item.htm?id=10919470266
:127465602(已满) 146524112
分享到:
相关推荐
esp32开发板esp-mesh wifi组网可行性文档分析
近来有些刚入门的用户,不太了解.NET Micro Framework开发板的使用,所以写了这篇文档,以期缩短用户对开发板的熟悉时间。
两块STM32,一个做主机一个做从机,能够实现主机发送数据以及主机读取从机数据。通过串口调试,以及LED灯来提示工作状态。
mini2440开发板--CMOS摄像头数据手册
.NET Micro Framework开发板原理图(红牛开发板)
与教程--FPGA基础入门【11】开发板USB-UART串口通信配置--相应的源代码。 根目录包含: 1. 相关文档,nexys4ddr_rm.pdf是开发板文档;DS_FT2232H.pdf是UART芯片FT2232HQ文档 2. src/包含所有源代码 3. sim/包含...
.NET Micro Framework开发板使用手册(红牛开发板)
这是神舟I号开发板--显示示例,可以正常使用
普中STM32-PZ6806L开发板资料光盘结构 | |---1--用户必看 | |--KEIL5安装教程 | |--普中ARM仿真器使用说明 | |--普中PZ6806L开发板入门教程 | |---2--开发板原理图 | |--彩屏原理图-----------------对应...
STM32_Nano开发板--原理图 很完整 不错,欢迎下载
三星四核ARM开发板RP-Exynos4412开发板全功能新增GPS模块。全功能的RP-Exynos4412开发板免费赠送GPS模块。有意向的朋友不妨了解一下。
北京瑞泰公司 DSP开发板 ICETEK-DM642-PCI_原理图_v1.rar 绝对正确 我发现有一个要10分资源分的 那个是骗人的他用的是TI 的EM
ALIENTEK MiniSTM32开发板例程-库函数版本
Sifive开发板U-BOOT启动信息和调试
4412开发板linux-QT下使用wfi设置.
优龙开发板 YL-E2410A原理图 S3C2410为核心开发板 优龙开发板套件 值得学习 分为核心板CORE;和扩展板 一共两个原理图
s3c6410开发板 u-boot_sd-ram256.bin : 支持SD启动,适用于DDR RAM内存容量为256M的配置
Nucleo 开发板ST-link驱动,win10可用
15单片机外部中断 STC-开发板4-程序-C语言-V2_20150112