使用NetworkStream 的BeginRead方法,要注意的是,必须使用异步结束时候获得的numberOfBytesRead长度,否则可能会 有问题。
下面的代码需要递归调用,直到全部下载完成。
myNetworkStream.BeginRead(myReadBuffer, 0, numberOfBytesRead, new AsyncCallback(myReadCallBack), myNetworkStream);
详细代码如下:
static void Main(string[] args) { string html = GetHTMLTCP("http://localhost:4169/Default.aspx"); Console.Write(html); Console.Read(); } private static string GetHTMLTCP(string URL) { string strHTML = "";//用来保存获得的HTML代码 TcpClient clientSocket = new TcpClient(); Uri URI = new Uri(URL); clientSocket.Connect(URI.Host, URI.Port); StringBuilder RequestHeaders = new StringBuilder();//用来保存HTML协议头部信息 RequestHeaders.AppendFormat("{0} {1} HTTP/1.1/r/n", "GET"/*此处可填写GET或POST*/, URI.PathAndQuery); RequestHeaders.AppendFormat("Connection:close/r/n"); RequestHeaders.AppendFormat("Host:{0}/r/n", URI.Host); RequestHeaders.AppendFormat("Accept:*/*/r/n"); RequestHeaders.AppendFormat("Accept-Language:zh-cn/r/n"); RequestHeaders.AppendFormat("User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)/r/n/r/n"); Encoding encoding = Encoding.Default; byte[] request = encoding.GetBytes(RequestHeaders.ToString()); clientSocket.Client.Send(request); //获取要保存的网络流 NetworkStream readStream = clientSocket.GetStream(); //StreamReader sr = new StreamReader(readStream, Encoding.Default); //strHTML = sr.ReadToEnd(); //readStream.Close(); //clientSocket.Close(); //readStream.EndRead(); //return strHTML; //下面的方式为异步接收数据 if (readStream.CanRead) { byte[] buf = new byte[1024]; IAsyncResult result = readStream.BeginRead(buf, 0, buf.Length, new AsyncCallback(myReadCallBack), readStream); } return ""; } public static void myReadCallBack(IAsyncResult ar) { NetworkStream myNetworkStream = (NetworkStream)ar.AsyncState; byte[] myReadBuffer = new byte[1024]; String myCompleteMessage = ""; int numberOfBytesRead; numberOfBytesRead = myNetworkStream.EndRead(ar); if (numberOfBytesRead < 1) return; // message received may be larger than buffer size so loop through until you have it all. while (myNetworkStream.DataAvailable) { //System.Threading.Thread.Sleep(10); myNetworkStream.BeginRead(myReadBuffer, 0, numberOfBytesRead, new AsyncCallback(myReadCallBack), myNetworkStream); //myCompleteMessage = //String.Concat(myCompleteMessage, Encoding.Default.GetString(myReadBuffer, 0, numberOfBytesRead)); myCompleteMessage = Encoding.Default.GetString(myReadBuffer, 0, numberOfBytesRead); // Print out the received message to the console. Console.WriteLine(myCompleteMessage); } }
