C# HTTP请求 读写流问题, 读取丢失问题,请问什么原因?

DaiRB 2009-11-21 04:23:02
代码逻辑是这样的,传入域名后,发送HTTP 请求,就收返回的数据。 但不知道什么原因,发回来的数据总是不完整。代码如下。

//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();


执行后以上返回的结果总是不完整,多点几次, 返回的 长度都不一样, 但有规律, 一般是2倍长度的差距。 费解啊。 谁知道原因 指点下,谢谢。
...全文
571 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
开心卷毛 2011-09-16
  • 打赏
  • 举报
回复
我也碰到过此类问题。
后来解决了。
先把文件流读一下,然后再通过流创建字节数组。接着进行下一步逻辑就不会有问题了。
rizher 2009-11-24
  • 打赏
  • 举报
回复
帮顶~
DaiRB 2009-11-24
  • 打赏
  • 举报
回复
自己测试搞定了,如果调用 NetWorkStream.Read. 管道为空 所以就 会 卡死掉,
可能是.NET 框架的问题, 而不是 阻塞等待 数据, 因为前面测试,总是执行到 ns.Read的时候 程序 异常了,所以 我 把 退出条件 换成了 DataAvailable 就没 不会异常了, 但他为假的条件好像 只要管道 为空就 为假了, 所以提前退出了循环。
我把 接收超时时间 设置短点, 超时会抛出异常。 然后退出循环。
把代码改成下面就行了。 上面 大家提供的 方法 都会卡掉 不能正常执行。


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);
xiamiking 2009-11-23
  • 打赏
  • 举报
回复
int l=0;
do
{
l=ns.Read(data, 0, data.Length);
if (l>0)
{
mStream.Write(data, 0, l);
}

} while (myNetworkStream.DataAvailable || l>0 );
循序条件改成或者试试?
michaelnami 2009-11-23
  • 打赏
  • 举报
回复
最简单了,用浏览器输入uRL看有没有返回 ,如没有就是程序写错了
马老虎 2009-11-23
  • 打赏
  • 举报
回复
试着读取一下其他网站!
zw_548498 2009-11-23
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分
烈火蜓蜻 2009-11-23
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分
gongsun 2009-11-23
  • 打赏
  • 举报
回复
...
zhongjiekangping 2009-11-22
  • 打赏
  • 举报
回复
HttpWevRequest 类 来获取做 Http请求 当然 比 Socket 和Tcp 慢
DaiRB 2009-11-22
  • 打赏
  • 举报
回复

do
{
ns.Read(data, 0, data.Length);
mStream.Write(data, 0, data.Length);
//在这个地方加上,Sleep后,显然接受的数据要多点了,明显是服务器,写入不同步。
//导致管道为空提前退出了,但这种方式很不合理。
//要是能得到服务器,断开连接的事件应该就能合理的设计了,如何获得这类信息?
Thread.Sleep(100);

} while (ns.DataAvailable);

wangminqi 2009-11-22
  • 打赏
  • 举报
回复
int l=0;
do
{
l=ns.Read(data, 0, data.Length);
if (l>0)
{
mStream.Write(data, 0, l);
}

} while (l>0 );



循环条件改成这样呢?

http://www.mybuffet.cn
DaiRB 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zxl198313 的回复:]
byte[] data = new byte[2048];
把发送的数据量改少一点,看能收到全部不,估计是你定义的data长度不够,比如发送两个字看能全部收到不
[/Quote]
data 缓存改成 512 接受得更少 2000多字节, 改成 10240 接受得也少 2000多字节。 用2048 接收 是通常是返回 4000个字节。 如果单步调试, 一下一下按 可以接受 10000 多来字节, 但不管怎样就是 不完整. 我估计是远程服务器, 传输速率和 我读取速度 不一致, 导致在读取的时候误判 while (ns.DataAvailable); 流为空(服务器还没来得及写),导致 提前退出读取循环。 不知道是不是这样, 但 如果是这样 如何解决?
如果用 HttpWevRequest 类 来获取做 Http请求,到是能完全 得到。 但不知道怎么搞的, 速度根本无法接受,第一次连接通常要 5秒 才有返回,也不知道什么原因.用 Socket 和Tcp 到是绝对快 追中了下 0.03秒就返回了。 但有又上面那问题...
zxl198313 2009-11-21
  • 打赏
  • 举报
回复
byte[] data = new byte[2048];
把发送的数据量改少一点,看能收到全部不,估计是你定义的data长度不够,比如发送两个字看能全部收到不
DaiRB 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wangminqi 的回复:]
试试

int l=0;
do
            {
                l=ns.Read(data, 0, data.Length);
                if (l>0)
                {
                    mStream.Write(data, 0, l);
                }

            } while (myNetworkStream.DataAvailable && l>0 );


http://www.mybuffet.cn
[/Quote]
试了,不是这样的,还是不行 ...
wangminqi 2009-11-21
  • 打赏
  • 举报
回复
试试

int l=0;
do
{
l=ns.Read(data, 0, data.Length);
if (l>0)
{
mStream.Write(data, 0, l);
}

} while (myNetworkStream.DataAvailable && l>0 );


http://www.mybuffet.cn

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧