《最新Http 协议数据传输.doc》由会员分享,可在线阅读,更多相关《最新Http 协议数据传输.doc(47页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精品资料Http 协议数据传输.1using System;using System.Collections.Generic;using System.Text;using System.Net;using System.Net.Sockets;using System.Collections;using System.IO;using System.Text.RegularExpressions;using RE = System.Text.RegularExpressions.Regex;using System.Security.Cryptography.X509Certificates
2、;/* *文件名:HttpProc.cs* *创建人:HeDaode* *日 期:2007.09.01* *描 述:实现HTTP协议中的GET、POST请求* *使 用:HttpProc.WebClient client = new HttpProc.WebClient(); client.Encoding = System.Text.Encoding.Default;/默认编码方式,根据需要设置其他类型 client.OpenRead(普通get请求 MessageBox.Show(client.RespHtml);/获取返回的网页源代码 client.DownloadFile(下载文件 c
3、lient.OpenRead(提交表单,此处是登录百度的示例 client.UploadFile(, file1=D:1.mp3);/上传文件 client.UploadFile(, folder=myfolder&size=4003550,file1=D:1.mp3);/提交含文本域和文件域的表单*/namespace HttpProc / /上传事件委托 / / / public delegate void WebClientUploadEvent(object sender, HttpProc.UploadEventArgs e); / /下载事件委托 / / / public dele
4、gate void WebClientDownloadEvent(object sender, HttpProc.DownloadEventArgs e); / /上传事件参数 / public struct UploadEventArgs / /上传数据总大小 / public long totalBytes; / /已发数据大小 / public long bytesSent; / /发送进度(0-1) / public double sendProgress; / /发送速度Bytes/s / public double sendSpeed; / /下载事件参数 / public str
5、uct DownloadEventArgs / /下载数据总大小 / public long totalBytes; / /已接收数据大小 / public long bytesReceived; / /接收数据进度(0-1) / public double ReceiveProgress; / /当前缓冲区数据 / public byte receivedBuffer; / /接收速度Bytes/s / public double receiveSpeed; / /实现向WEB服务器发送和接收数据 / public class WebClient private WebHeaderColle
6、ction requestHeaders, responseHeaders; private TcpClient clientSocket; private MemoryStream postStream; private Encoding encoding = Encoding.Default; private const string BOUNDARY = -HEDAODE-; private const int SEND_BUFFER_SIZE = 10245; private const int RECEIVE_BUFFER_SIZE = 10245; private string c
7、ookie = ; private string respHtml = ; private string strRequestHeaders = ; private string strResponseHeaders = ; private int statusCode = 0; private bool isCanceled = false; public event WebClientUploadEvent UploadProgressChanged; public event WebClientDownloadEvent DownloadProgressChanged; / /初始化We
8、bClient类 / public WebClient() responseHeaders = new WebHeaderCollection(); requestHeaders = new WebHeaderCollection(); / /读取指定URL的文本 / /请求的地址 /服务器响应文本 public string OpenRead(string URL) requestHeaders.Add(Connection, close); SendRequestData(URL, GET); return GetHtml(); /解决证书过期无法访问的问题 class CertPolic
9、y : ICertificatePolicy public bool CheckValidationResult(ServicePoint srvpt, X509Certificate cert, WebRequest req, int certprb) return true; / /采用https协议访问网络 / /url地址 /发送的数据 / public string OpenReadWithHttps(string URL,string strPostdata) ServicePointManager.CertificatePolicy = new CertPolicy(); Htt
10、pWebRequest request = (HttpWebRequest)WebRequest.Create(URL); request.CookieContainer = new CookieContainer(); request.Method = POST; request.Accept = */*; request.ContentType=application/x-www-form-urlencoded; byte buffer = this.encoding.GetBytes(strPostdata); request.ContentLength = buffer.Length;
11、 request.GetRequestStream().Write(buffer, 0, buffer.Length); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), encoding); this.respHtml = reader.ReadToEnd(); foreach (System.Net.Cookie ck in response.Cookies) this.
12、cookie += ck.Name + = + ck.Value + ; reader.Close(); return respHtml; / /读取指定URL的文本 / /请求的地址 /向服务器发送的文本数据 /服务器响应文本 public string OpenRead(string URL, string postData) byte sendBytes = encoding.GetBytes(postData); postStream = new MemoryStream(); postStream.Write(sendBytes, 0, sendBytes.Length); requ
13、estHeaders.Add(Content-Length, postStream.Length.ToString(); requestHeaders.Add(Content-Type, application/x-www-form-urlencoded); requestHeaders.Add(Connection, close); SendRequestData(URL, POST); return GetHtml(); / /读取指定URL的流 / /请求的地址 /向服务器发送的数据 /服务器响应流 public Stream GetStream(string URL, string p
14、ostData) byte sendBytes = encoding.GetBytes(postData); postStream = new MemoryStream(); postStream.Write(sendBytes, 0, sendBytes.Length); requestHeaders.Add(Content-Length, postStream.Length.ToString(); requestHeaders.Add(Content-Type, application/x-www-form-urlencoded); requestHeaders.Add(Connectio
15、n, close); SendRequestData(URL, POST); MemoryStream ms = new MemoryStream(); SaveNetworkStream(ms); return ms; / /上传文件到服务器 / /请求的地址 /文件域(格式如:file1=C:test.mp3&file2=C:test.jpg) /服务器响应文本 public string UploadFile(string URL, string fileField) return UploadFile(URL, , fileField); / /上传文件和数据到服务器 / /请求地址
16、/文本域(格式为:name1=value1&name2=value2) /文件域(格式如:file1=C:test.mp3&file2=C:test.jpg) /服务器响应文本 public string UploadFile(string URL, string textField, string fileField) postStream = new MemoryStream(); if (textField != & fileField != ) WriteTextField(textField); WriteFileField(fileField); else if (fileFiel
17、d != ) WriteFileField(fileField); else if (textField != ) WriteTextField(textField); else throw new Exception(文本域和文件域不能同时为空。); /写入结束标记 byte buffer = encoding.GetBytes(- + BOUNDARY + -rn); postStream.Write(buffer, 0, buffer.Length); /添加请求标头 requestHeaders.Add(Content-Length, postStream.Length.ToStrin
18、g(); requestHeaders.Add(Content-Type, multipart/form-data; boundary= + BOUNDARY); requestHeaders.Add(Connection, Keep-Alive); /发送请求数据 SendRequestData(URL, POST, true); /返回响应文本 return GetHtml(); / /分析文本域,添加到请求流 / /文本域 private void WriteTextField(string textField) string strArr = RE.Split(textField, &
19、); textField = ; foreach (string var in strArr) Match M = RE.Match(var, (=+)=(.+); textField += - + BOUNDARY + rn; textField += Content-Disposition: form-data; name= + M.Groups1.Value + rnrn + M.Groups2.Value + rn; byte buffer = encoding.GetBytes(textField); postStream.Write(buffer, 0, buffer.Length
20、); / /分析文件域,添加到请求流 / /文件域 private void WriteFileField(string fileField) string filePath = ; int count = 0; string strArr = RE.Split(fileField, &); foreach (string var in strArr) Match M = RE.Match(var, (=+)=(.+); filePath = M.Groups2.Value; fileField = - + BOUNDARY + rn; fileField += Content-Disposi
21、tion: form-data; name= + M.Groups1.Value + ; filename= + Path.GetFileName(filePath) + rn; fileField += Content-Type: image/jpegrnrn; byte buffer = encoding.GetBytes(fileField); postStream.Write(buffer, 0, buffer.Length); /添加文件数据 FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read
22、); buffer = new byte50000; do count = fs.Read(buffer, 0, buffer.Length); postStream.Write(buffer, 0, count); while (count 0); fs.Close(); fs.Dispose(); fs = null; buffer = encoding.GetBytes(rn); postStream.Write(buffer, 0, buffer.Length); / /从指定URL下载数据流 / /请求地址 /数据流 public Stream DownloadData(string
23、 URL) requestHeaders.Add(Connection, close); SendRequestData(URL, GET); MemoryStream ms = new MemoryStream(); SaveNetworkStream(ms, true); return ms; / /从指定URL下载文件 / /文件URL地址 /文件保存路径,含文件名(如:C:test.jpg) public void DownloadFile(string URL, string fileName) requestHeaders.Add(Connection, close); SendR
24、equestData(URL, GET); FileStream fs = new FileStream(fileName, FileMode.Create); SaveNetworkStream(fs, true); fs.Close(); fs = null; / /向服务器发送请求 / /请求地址 /POST或GET /是否显示上传进度 private void SendRequestData(string URL, string method, bool showProgress) clientSocket = new TcpClient(); Uri URI = new Uri(UR
25、L); clientSocket.Connect(URI.Host, URI.Port); requestHeaders.Add(Host, URI.Host); byte request = GetRequestHeaders(method + + URI.PathAndQuery + HTTP/1.1); clientSocket.Client.Send(request); /若有实体内容就发送它 if (postStream != null) byte buffer = new byteSEND_BUFFER_SIZE; int count = 0; Stream sm = client
26、Socket.GetStream(); postStream.Position = 0; UploadEventArgs e = new UploadEventArgs(); e.totalBytes = postStream.Length; System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();/计时器 timer.Start(); do /如果取消就推出 if (isCanceled) break; /读取要发送的数据 count = postStream.Read(buffer, 0, buffer
27、.Length); /发送到服务器 sm.Write(buffer, 0, count); /是否显示进度 if (showProgress) /触发事件 e.bytesSent += count; e.sendProgress = (double)e.bytesSent / (double)e.totalBytes; double t = timer.ElapsedMilliseconds / 1000; t = t 0); timer.Stop(); postStream.Close(); /postStream.Dispose(); postStream = null; /end if
28、/ /向服务器发送请求 / /请求URL地址 /POST或GET private void SendRequestData(string URL, string method) SendRequestData(URL, method, false); / /获取请求头字节数组 / /POST或GET请求 /请求头字节数组 private byte GetRequestHeaders(string request) requestHeaders.Add(Accept, */*); requestHeaders.Add(Accept-Language, zh-cn); requestHeaders.Add(User-Agent, Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1