服务端:
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; } }
客户端:
<!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>