110,536
社区成员
发帖
与我相关
我的任务
分享
//HTTP连接请求
string requestInfo = "GET /" + urlParameters + " HTTP/1.1\r\nHost: " + hostName + "\r\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.14) Gecko/2009082707 Firefox/3.0.14\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: zh-cn,zh;q=0.5\r\nAccept-Encoding: deflate\r\nAccept-Charset: gb2312,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\nConnection: keep-alive\r\nCache-Control: no-cache\r\n\r\n";
byte[] sendData = Encoding.ASCII.GetBytes(requestInfo);
byte[] data = new byte[2048];
//创建TCP连接
TcpClient client = new TcpClient();
client.Connect(hostName, 80);
NetworkStream ns = client.GetStream();
//向服务器发送请求信息
ns.Write(sendData, 0, sendData.Length);
//建立临时缓冲流,供后面字符编码
mStream = new MemoryStream();
do
{
ns.Read(data, 0, data.Length);
mStream.Write(data, 0, data.Length);
} while (ns.DataAvailable);
mStream.Position = 0;
//编码字符串,显示
StreamReader sReader = new StreamReader(mStream, Encoding.GetEncoding("UTF-8"));
//StreamReader sReader = new StreamReader(mStream, Encoding.GetEncoding("GB2312"));
string html = sReader.ReadToEnd();
//在 textbox 中显示返回的HTML结果,
txtHtml.Text = html;
lblInfo.Text = txtHtml.Text.Length.ToString();
int rev = 0;
//设置超时时间,服务器是连续写入数据,一般在这个时间内 ns中就回有数据可读
client.ReceiveTimeout = 100;
do
{
try
{
//一般情况下超时,就表示 服务器数据发送完了。
// 测试了些数据量大的网页,返回正常
rev = ns.Read(revData, 0, revData.Length);
ms.Write(revData, 0, rev);
}
catch
{
rev = 0;
}
} while (rev > 0);
do
{
ns.Read(data, 0, data.Length);
mStream.Write(data, 0, data.Length);
//在这个地方加上,Sleep后,显然接受的数据要多点了,明显是服务器,写入不同步。
//导致管道为空提前退出了,但这种方式很不合理。
//要是能得到服务器,断开连接的事件应该就能合理的设计了,如何获得这类信息?
Thread.Sleep(100);
} while (ns.DataAvailable);