日期:2014-05-17  浏览次数:21118 次

socket receive如何确定接收完毕?
使用socket类进行web服务器的访问,由于其它情况不能使用更高级的类,向服务器发送数据后,服务器返回包的个数不定(根据页面情况而定),我怎样知道这个页面已经接收完毕?
string ss;
while(true)
{
    byte[] recvBytes = new byte[1024];
    bytes = c.Receive(recvBytes);
  ss = ss+bytes.tostring();
}
我用这个循环读取,接收到包后都存在ss中,可不知道什么时候就收完了?

------解决方案--------------------
Socked对象的Available属性+ ReceiveTimeout就可以判断时候接收完毕了,但是这样也不能百分之百的判断出。
我个人认为要用套接字进行通讯,那么最好还是自己定义数据帧,自己组织数据包进行传递,除非是使用大家都已经熟悉的UDP、HTTp传输协议,否则是一件很痛苦的事情!!
------解决方案--------------------
ss = ss+bytes.tostring(); //这个不行吧.
一般来讲,你可以先接受200-300个byte,这些基本上是http头。
你先把这些字节转化为string(使用gb2312编码转化,也可以尝试其他的编码)。
然后分行读取,每行检测相关http头信息。
http头里边有个Content-Length:的属性,//aline为其中的一行
int jj = aline.IndexOf("Content-Length:");
int ee = aline.Length - 15; 
lenstr = aline.Substring(15, ee);
lenst = Int32.Parse(lenstr); //得到正文长度,也就是html文件源代码的长度
然后,你再检测空行(因为http头和正文之间使用空行分开)。
在接下来,你就可以用lenst来接受正文的长度了。
值得注意的是,有可能,http头假如只有234个字节,那么,第一次你接受的300个字节中已经含有了部分正文信息,
那么你再次需要接受的字节数应该是:lenst-(300-234).

------解决方案--------------------
你最好把传送的数据封装一下!!
加个头和尾!!
头为开始读数据,
尾为读数据结束!!!