`
lovecontry
  • 浏览: 1035495 次
文章分类
社区版块
存档分类
最新评论

【.Net MF网络开发板研究-02】Http Server功能演示

 
阅读更多

在上一篇博文中介绍的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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics