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

服务端:

 




 
   
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) !=  
    1)  
    return; 
    
              
    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( 
    0,  
    20),  
    " 
    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; 
    
         } 
    
     } 
    
   


 
  
客户端:
 
 
  


 
   
" 
    -//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>