zoukankan      html  css  js  c++  java
  • 【.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

    QQ群:127465602(已满) 146524112

  • 相关阅读:
    php基础
    MYSQL 常用函数
    MYSQL 练习题
    MYSQL 查询
    MYSQL:增删改
    隐藏导航
    分层导航
    图片轮播!
    你帅不帅?
    PHP 流程
  • 原文地址:https://www.cnblogs.com/yefanqiu/p/2097015.html
Copyright © 2011-2022 走看看