用HttpListener做web服务器,简单解析post方式过来的参数、上传的文件

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:

服务端:

 

复制代码
public  class AdvertisementSource : IDisposable
    {
        HttpListener httpListener;
         bool stopped;

         #region 构造和析构

         // ==

         #region IDisposable
        [System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
         int disposedFlag;

        ~AdvertisementSource()
        {
            Dispose( false);
        }

         ///   <summary>
        
///  释放所占用的资源
        
///   </summary>
         public  void Dispose()
        {
            Dispose( true);
            GC.SuppressFinalize( this);
        }

         ///   <summary>
        
///  获取该对象是否已经被释放
        
///   </summary>
        [System.ComponentModel.Browsable( false)]
         public  bool IsDisposed
        {
             get
            {
                 return disposedFlag !=  0;
            }
        }

         #endregion

         protected  virtual  void Dispose( bool disposing)
        {
             if (System.Threading.Interlocked.Increment( ref disposedFlag) !=  1return;
             if (disposing)
            {
                httpListener.Stop();
            }
             // 在这里编写非托管资源释放代码
        }

         #endregion

         public  void Initialize()
        {
            httpListener =  new HttpListener();
            httpListener.Prefixes.Add( string.Format( " http://*:{0}/AdSource/ "8080));
            httpListener.Start();
            httpListener.BeginGetContext(GetHttpContextCallback,  null);

        }       
        
         public  void GetHttpContextCallback(IAsyncResult iar)
        {
             if (stopped)  return;
             var context = httpListener.EndGetContext(iar);
            httpListener.BeginGetContext(GetHttpContextCallback,  null);
             string endPoint = context.Request.RemoteEndPoint.ToString();
             int spIndex = endPoint.IndexOf( " : ");
            endPoint = endPoint.Substring( 0, spIndex);
           
             using (HttpListenerResponse response = context.Response)
            {
         //get 的方式在如下解析即可得到客户端参数及值
                 // string userName = context.Request.QueryString["userName"];
                
// string password = context.Request.QueryString["password"];
                
// string suffix = context.Request.QueryString["suffix"];
                
// string adType = context.Request.QueryString["adtype"]; // 文字,图片,视频

             
                
                 if (!context.Request.HasEntityBody) // 无数据
                {
                    response.StatusCode =  403;
                     return;
                }

                 string userName =  "";
                 string password =  "";
                 string suffix =  "";
                 string adType =  "";
               //post 的方式有文件上传的在如下解析即可得到客户端参数及值

                HttpListenerRequest request = context.Request;                
                 if (request.ContentType.Length >  20 &&  string.Compare(request.ContentType.Substring( 020),  " multipart/form-data; "true) ==  0)
                {
                    List<Values> lst =  new List<Values>();
                    Encoding Encoding = request.ContentEncoding;
                     string[] values = request.ContentType.Split( ' ; ').Skip( 1).ToArray();
                     string boundary =  string.Join( " ; ", values).Replace( " boundary= """).Trim();
                     byte[] ChunkBoundary = Encoding.GetBytes( " -- " + boundary +  " \r\n ");
                     byte[] EndBoundary = Encoding.GetBytes( " -- " + boundary +  " --\r\n ");
                    Stream SourceStream = request.InputStream;
                     var resultStream =  new MemoryStream();
                     bool CanMoveNext =  true;
                    Values data =  null;
                     while (CanMoveNext)
                    {
                         byte[] currentChunk = ReadLineAsBytes(SourceStream);
                         if (!Encoding.GetString(currentChunk).Equals( " \r\n "))
                            resultStream.Write(currentChunk,  0, currentChunk.Length);
                         if (CompareBytes(ChunkBoundary, currentChunk))
                        {
                             byte[] result =  new  byte[resultStream.Length - ChunkBoundary.Length];
                            resultStream.Position =  0;
                            resultStream.Read(result,  0, result.Length);
                            CanMoveNext =  true;
                             if (result.Length >  0)
                                data.datas = result;
                            data =  new Values();
                            lst.Add(data);
                            resultStream.Dispose();
                            resultStream =  new MemoryStream();

                        }
                         else  if (Encoding.GetString(currentChunk).Contains( " Content-Disposition "))
                        {
                             byte[] result =  new  byte[resultStream.Length -  2];
                            resultStream.Position =  0;
                            resultStream.Read(result,  0, result.Length);
                            CanMoveNext =  true;
                            data.name = Encoding.GetString(result).Replace( " Content-Disposition: form-data; name=\" """).Replace( " \" """).Split( ' ; ')[ 0];
                            resultStream.Dispose();
                            resultStream =  new MemoryStream();
                        }
                         else  if (Encoding.GetString(currentChunk).Contains( " Content-Type "))
                        {
                            CanMoveNext =  true;
                            data.type =  1;
                            resultStream.Dispose();
                            resultStream =  new MemoryStream();
                        }
                         else  if (CompareBytes(EndBoundary, currentChunk))
                        {
                             byte[] result =  new  byte[resultStream.Length - EndBoundary.Length -  2];
                            resultStream.Position =  0;
                            resultStream.Read(result,  0, result.Length);
                            data.datas = result;
                            resultStream.Dispose();
                            CanMoveNext =  false;
                        }
                    }
                     foreach ( var key  in lst)
                    {
                         if (key.type ==  0)
                        {
                             string value = Encoding.GetString(key.datas).Replace( " \r\n """);
                             if (key.name ==  " username ")
                                userName = value;
                             if (key.name ==  " password ")
                                password = value;
                             if (key.name ==  " suffix ")
                                suffix = value;
                             if (key.name ==  " adtype ")
                                adType = value;
                        }                        
                         if (key.type ==  1)
                        {
                            FileStream fs =  new FileStream( " c:\\3.jpg ", FileMode.Create);
                            fs.Write(key.datas,  0, key.datas.Length);
                            fs.Close();
                            fs.Dispose();
                        }
                    }
                   
                     if (userName !=  " test " || password !=  " test " ||  string.IsNullOrEmpty(suffix) ||  string.IsNullOrEmpty(adType))
                    {
                        response.StatusCode =  403;
                         return;
                    }
                     int adtype =  0;
                     int.TryParse(adType,  out adtype);
                }

                response.ContentType =  " text/html;charset=utf-8 ";
                 try
                {
                     using (System.IO.Stream output = response.OutputStream)
                     using (StreamWriter writer =  new StreamWriter(output, Encoding.UTF8))
                        writer.WriteLine( " 接收完成! ");
                }
                 catch
                {
                }
                response.Close();
            }
        }

         byte[] ReadLineAsBytes(Stream SourceStream)
        {
             var resultStream =  new MemoryStream();
             while ( true)
            {
                 int data = SourceStream.ReadByte();
                resultStream.WriteByte(( byte)data);
                 if (data ==  10)
                     break;
            }
            resultStream.Position =  0;
             byte[] dataBytes =  new  byte[resultStream.Length];
            resultStream.Read(dataBytes,  0, dataBytes.Length);
             return dataBytes;
        }
         
         bool CompareBytes( byte[] source,  byte[] comparison)
        {
             int count = source.Length;
             if (source.Length != comparison.Length)
                 return  false;
             for ( int i =  0; i < count; i++)
                 if (source[i] != comparison[i])
                     return  false;
             return  true;
        }

         public  class Values
        {
             public  int type =  0; // 0参数,1文件
             public  string name;
             public  byte[] datas;
        }
    }
复制代码

客户端:

 

复制代码
<!DOCTYPE html PUBLIC  " -//W3C//DTD XHTML 1.0 Transitional//EN "  " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns= " http://www.w3.org/1999/xhtml ">
<head>
    <title></title>   
</head>

<body>
    <form method= " post " enctype= " multipart/form-data " action= " http://127.0.0.1:8080/AdSource/ ">
    <p>
        <input id= " File1 " name= " file1 " type= " file " /></p>
  <p>
        <input id= " username " name= " username " type= " text " value= " test " /></p>
      <p>
        <input id= " password " name= " password " type= " text " value= " test " /></p>
    <p>
        <input id= " suffix " name= " suffix " type= " text " value= " txt " /></p>
    <p>
        <input id= " adtype " name= " adtype " type= " text " value= " 0 "/></p>
    <p>
        <input id= " Button1 " type= " submit " value= " submit "  /></p>
    </form>    
</body>
</html>



本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/archive/2011/10/25/2223457.html,如需转载请自行联系原作者
相关文章
|
2月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
84 9
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
92 2
|
3月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
187 3
|
8天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
57 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
5天前
|
自然语言处理 文字识别 数据处理
多模态文件信息抽取:技术解析与实践评测!
在大数据和人工智能时代,企业和开发者面临的挑战是如何高效处理多模态数据(文本、图像、音频、视频)以快速提取有价值信息。传统方法效率低下,难以满足现代需求。本文将深度评测阿里云的多模态文件信息抽取解决方案,涵盖部署、应用、功能与性能,揭示其在复杂数据处理中的潜力。通过自然语言处理(NLP)、计算机视觉(CV)、语音识别(ASR)等技术,该方案助力企业挖掘多模态数据的价值,提升数据利用效率。
20 4
多模态文件信息抽取:技术解析与实践评测!
|
5天前
|
文字识别 自然语言处理 算法
从多模态到精准洞察:深度解析多模态文件信息提取解决方案!
阿里云推出《多模态数据信息提取》解决方案,涵盖文本、图像、音频、视频等多种数据形式的自动化处理。本文从部署体验、功能验证到实际应用,全面解析该方案的能力与潜力,帮助开发者高效提取和整合复杂数据,提升工作效率...
24 3
从多模态到精准洞察:深度解析多模态文件信息提取解决方案!
|
20天前
|
JSON 自然语言处理 Java
OpenAI API深度解析:参数、Token、计费与多种调用方式
随着人工智能技术的飞速发展,OpenAI API已成为许多开发者和企业的得力助手。本文将深入探讨OpenAI API的参数、Token、计费方式,以及如何通过Rest API(以Postman为例)、Java API调用、工具调用等方式实现与OpenAI的交互,并特别关注调用具有视觉功能的GPT-4o使用本地图片的功能。此外,本文还将介绍JSON模式、可重现输出的seed机制、使用代码统计Token数量、开发控制台循环聊天,以及基于最大Token数量的消息列表限制和会话长度管理的控制台循环聊天。
145 7
|
3月前
|
自然语言处理 数据处理 Python
python操作和解析ppt文件 | python小知识
本文将带你从零开始,了解PPT解析的工具、工作原理以及常用的基本操作,并提供具体的代码示例和必要的说明【10月更文挑战第4天】
561 60
|
2月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
46 3
|
2月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
60 3

热门文章

最新文章

推荐镜像

更多