[C#.NET][TCP Socket] 使用 HttpWebRequest 與 HttpWebResponse 類別取得伺服器串流
續上篇 [NetWork] 使用 HttpWebRequest 與 HttpWebResponse 類別取得伺服器資訊,本篇則是實作GetResponseStream(),用來取得網頁資料。
![]()
程式碼的流程都相同。
實作範例碼如下:
private void button1_Click(object sender, EventArgs e) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(textBox1.Text); request.Method = WebRequestMethods.Http.Get; HttpWebResponse response = null; Stream stream = null; StreamReader streamReader = null; try { response = (HttpWebResponse)request.GetResponse(); if (response.StatusCode==HttpStatusCode.OK) { stream = response.GetResponseStream(); streamReader = new StreamReader(stream); char[] buffer = new char[256]; int data = 0; string result = ""; //分批讀 while (true) { data = streamReader.Read(buffer, 0, buffer.Length); string msg = new string(buffer, 0, data); result = result + msg; if (data == 0) break; } txtResponse.Text = result; } } catch (WebException ex1) { HttpWebResponse exResponse = (HttpWebResponse)ex1.Response; MessageBox.Show(ex1.Message); } catch (NotSupportedException ex2) { MessageBox.Show(ex2.Message); } catch (ProtocolViolationException ex3) { MessageBox.Show(ex3.Message); } catch (InvalidOperationException ex4) { MessageBox.Show(ex4.Message); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { if (response != null) response.Close(); if (streamReader != null) streamReader.Close(); if (stream != null) stream.Close(); } }
接下來採用非同步方法來處理
private void button2_Click(object sender, EventArgs e) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(textBox1.Text); request.Method = WebRequestMethods.Http.Get; request.BeginGetResponse(new AsyncCallback(responseCallback), request); } void responseCallback(IAsyncResult Result) { HttpWebRequest request = Result.AsyncState as HttpWebRequest; HttpWebResponse response = request.EndGetResponse(Result) as HttpWebResponse;//取得串流資料 if (response.StatusCode == HttpStatusCode.OK) { Stream stream = response.GetResponseStream(); StreamReader streamReader = new StreamReader(stream); char[] buffer = new char[256]; int data = 0; string result = ""; //分批讀 while (true) { data = streamReader.Read(buffer, 0, buffer.Length); string msg = new string(buffer, 0, data); result = result + msg; if (data == 0) break; } this.BeginInvoke(new updateControl(UpdateControl), new object[] { txtResponse, result }); //txtResponse.Text = result; } } delegate void updateControl(Control Ctrl, string Msg); void UpdateControl(Control Ctrl, string Msg) { ((TextBox)Ctrl).Text = Msg; }
執行結果仍與上圖相同,這次就懶的抓例外。
每一個網站類型都不太一樣,若是不同的網站,程式碼分析的流程也會有所不同,所以若遇到錯誤,就得多花點精神除錯了。
浙公网安备 33010602011771号