zoukankan      html  css  js  c++  java
  • C# 写的 HttpRequsetResponse 类,异步、事件... 还热乎着呢!

    //调用示例:
    /*
    2003-7-1
    1.支持Proxy
    2.可指定同步或异步
    3.一些小修改
    */

    private void button1_Click(object sender, System.EventArgs e)
    ?{
    ??HttpRequestResponse xx = new HttpRequestResponse();
    ??xx.DataArrival += new DataArrivalEventHandler(xx_DataArrival);
    ??//xx.SendRequest(@"http://localhost:2080/examples/myservlets/servlet2","message=QQ&desttel=13910911925&mytel=13910081138&mypwd=263996211");
    ??xx.SendRequest(@"http://localhost","message=你好QQ&desttel=13910911925&mytel=13910081138&mypwd=263996211","GET",true);
    ??xx.SendRequest("http://localhost/quickstart/util/srcview.aspx?path=/quickstart/howto/samples/net/WebRequests/clientGETasync.src","post",false);
    ?}
    private int i=0;
    private void xx_DataArrival(object sender, DataArrivalEventArgs e)
    ?{
    ??Console.WriteLine( i++);
    ??Console.Write(e.RecievedData? );
    ??if (e.IsComplete)
    ???{
    ???Console.Write("[" + ((HttpRequestResponse) sender).Request.CookieContainer.GetCookieHeader(((HttpRequestResponse) sender).Response.ResponseUri).ToString() + "]");
    ???}
    ??}

    //========================
    //Class1.cs

    using System;
    using System.Net;
    using System.Threading;
    using System.Text;
    using System.IO;

    public class RequestState
    {
    ?const int BUFFER_SIZE = 1024;
    ?public System.Text.StringBuilder RequestData;
    ?public byte[] BufferRead;
    ?public System.Net.HttpWebRequest Request;
    ?public System.IO.Stream ResponseStream;
    ?public System.Text.Decoder StreamDecode = System.Text.Encoding.GetEncoding("gb2312").GetDecoder();
    ?public RequestState()
    ?{
    ??BufferRead = new byte[BUFFER_SIZE];
    ??RequestData = new System.Text.StringBuilder("");
    ??Request = null;
    ??ResponseStream = null;
    ?}
    }
    public delegate void DataArrivalEventHandler(object sender, DataArrivalEventArgs e);
    public class DataArrivalEventArgs : System.EventArgs
    {
    ?private string mRecievedData;
    ?private bool mIsComplete = false;
    ?public DataArrivalEventArgs(string Data,bool Complete)
    ?{
    ??mRecievedData = Data;
    ??mIsComplete = Complete;
    ?}
    ?public string RecievedData
    ?{
    ??get
    ??{
    ???return mRecievedData;
    ??}
    ?}
    ?public bool IsComplete
    ?{
    ??get
    ??{
    ???return mIsComplete;
    ??}
    ?}
    }

    class HttpRequestResponse
    {
    ?public static System.Threading.ManualResetEvent allDone = new System.Threading.ManualResetEvent(false);
    ?const int BUFFER_SIZE = 1024;
    ?public event DataArrivalEventHandler DataArrival;

    ?protected virtual void OnDataArrival(DataArrivalEventArgs e)
    ?{
    ??if (DataArrival != null)
    ??{
    ???DataArrival(this, e);
    ??}
    ?}
    ?private System.Text.Encoding mRequestEncoding = System.Text.Encoding.GetEncoding("gb2312");
    ?private bool mUseProxy = false;
    ?public bool UseProxy
    ?{
    ??get
    ??{
    ???return mUseProxy;
    ??}
    ??set
    ??{
    ???mUseProxy = value;
    ??}
    ?}

    ?private System.Net.WebProxy mWP = System.Net.WebProxy.GetDefaultProxy();
    ?public System.Net.WebProxy Proxy
    ?{
    ??get
    ??{
    ???return mWP;
    ??}
    ??set
    ??{
    ???mWP = value;
    ??}
    ?}

    ?private System.Net.HttpWebRequest mHWReq = null;
    ?public System.Net.HttpWebRequest Request
    ?{
    ??get
    ??{
    ???return mHWReq;
    ??}
    ?}
    ?
    ?private System.Net.HttpWebResponse mHWRsp = null;
    ?public System.Net.HttpWebResponse Response
    ?{
    ??get
    ??{
    ???return mHWRsp;
    ??}
    ?}
    ?public void SendRequest(string RequestURL,string RequestData,bool Async)
    ?{
    ??SendRequest(RequestURL,RequestData,"GET",Async);
    ?}
    ?public void SendRequest(string RequestURL,string RequestData,string RequestMethod,bool Async)
    ?{
    ??HttpWebRequest req;
    ??RequestState rs = new RequestState();
    ??if (RequestData != null)
    ??{
    ???int i=0, j;
    ???Char[] reserved = {'?', '=', '&'};
    ???while(i???{
    ????j=RequestData.IndexOfAny(reserved, i);
    ????if (j==-1)
    ????{
    ?????rs.RequestData.Append(System.Web.HttpUtility.UrlEncode(RequestData.Substring(i, RequestData.Length-i),mRequestEncoding));
    ?????break;
    ????}
    ????rs.RequestData.Append(System.Web.HttpUtility.UrlEncode(RequestData.Substring(i, j-i),mRequestEncoding));
    ????rs.RequestData.Append(RequestData.Substring(j,1));
    ????i = j+1;
    ???}
    ??}
    ??if (RequestMethod.ToUpper() == "POST")
    ??{
    ???byte[] Buffer = null;
    ???Buffer = mRequestEncoding.GetBytes(rs.RequestData.ToString());
    ???req =(HttpWebRequest) WebRequest.Create(RequestURL);
    ???req.ContentLength = Buffer.Length;
    ???req.Method = RequestMethod;
    ???req.ContentType = "application/x-www-form-urlencoded";
    ???Stream newStream = req.GetRequestStream();
    ???newStream.Write(Buffer, 0, Buffer.Length);
    ???newStream.Close();
    ??}
    ??else
    ??{
    ???req =(HttpWebRequest) WebRequest.Create(RequestURL + "?" + rs.RequestData.ToString());
    ??}
    ??req.Credentials = CredentialCache.DefaultCredentials;
    ??req.UserAgent = "playyuer@Microshaoft.com";
    ??req.KeepAlive = true;
    ??req.Headers.Set("Pragma", "no-cache");
    ??req.Timeout = 300000;
    ??if (mUseProxy)
    ??{
    ???if (mWP == null)
    ????mWP = System.Net.WebProxy.GetDefaultProxy();
    ???GlobalProxySelection.Select = mWP;
    ??}
    ??rs.Request = req;
    ??mHWReq = req;
    ??
    ??System.IAsyncResult r = (System.IAsyncResult) req.BeginGetResponse(new System.AsyncCallback(ResponseCallback), rs);
    ??if (!Async)
    ???allDone.WaitOne();
    ?}

    ?private void ResponseCallback(IAsyncResult ar)
    ?{
    ??RequestState rs = (RequestState) ar.AsyncState;
    ??System.Net.HttpWebRequest req = rs.Request;
    ??System.Net.HttpWebResponse resp = (System.Net.HttpWebResponse) req.EndGetResponse(ar);
    ??System.IO.Stream ResponseStream = resp.GetResponseStream();
    ??rs.ResponseStream = ResponseStream;
    ??IAsyncResult iarRead = ResponseStream.BeginRead(rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs);
    ?}

    ?private void ReadCallBack(IAsyncResult asyncResult)
    ?{
    ??RequestState rs = (RequestState)asyncResult.AsyncState;
    ??System.IO.Stream responseStream = rs.ResponseStream;
    ??int read = responseStream.EndRead( asyncResult );
    ??if (read > 0)
    ??{
    ???Char[] charBuffer = new Char[BUFFER_SIZE];
    ???int len = rs.StreamDecode.GetChars( rs.BufferRead, 0, read, charBuffer, 0 );
    ???System.String str = new System.String( charBuffer, 0, len);
    ???OnDataArrival(new DataArrivalEventArgs(str,false));
    ???rs.RequestData.Append(str);
    ???IAsyncResult ar = responseStream.BeginRead( rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs);
    ??}
    ??else
    ??{
    ???if(rs.RequestData.Length>1)
    ???{
    ????string strContent;
    ????strContent = rs.RequestData.ToString();
    ???}
    ???responseStream.Close();
    ???allDone.Set();
    ???OnDataArrival(new DataArrivalEventArgs("/n",true));
    ??}
    ??return;
    ?}
    }


  • 相关阅读:
    4.3 DDL 数据类型
    Log4j的简要概述
    Eclipse/IDEA使用小技巧
    idea-生成key的Java代码
    Java8新特性--lamada详解
    JQuery基本语法
    EL与Velocity基本语法总结:
    RAF(RandomAccessFile)类
    Java篇-File类之常用操作
    Java篇-File类之创建删除
  • 原文地址:https://www.cnblogs.com/Microshaoft/p/2485782.html
Copyright © 2011-2022 走看看