C#Socket怎么才能接收完整的数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#Socket怎么才能接收完整的数据相关的知识,希望对你有一定的参考价值。

byte[] recvBytes=new byte[1024*8];  
int bytes = 0;
while (true)

bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息     
//将读取的字节转换成字符串
recvStr += Encoding.GetEncoding("gb2312").GetString(recvBytes, 0, bytes);
if (bytes > 0)
break;

Console.WriteLine(">>>>>>>>>>>接收返回数据内容:"+recvStr);
//MessageBox.Show(recvStr);
c.Shutdown(SocketShutdown.Both);
c.Close();

Receive的返回值是接收的字节数,当是0时表示传送结束,否则循环接收
缓冲区不用太大,8k或64k看情况
Byte[] RecvBytes = new Byte[1024*8];
int iBytes = 1;
string strAllhtml = "";
while (iBytes > 0)

iBytes = conn.Receive(RecvBytes, RecvBytes.Length, 0);
strAllHtml += Encoding.UTF8.GetString(RecvBytes, 0, iBytes);
参考技术A 如何判断你接收的数据已经完了呢?假设你的缓冲区recvBytes大小小于你的数据,那剩下的数据如何处理呢?
所以这里其实有2个问题。
1、数据小于等于缓冲区:那么recvbytes应该就是你接收到的完整内容;
2、数据大于缓冲区:那么就要分多次来接收,这里就必须要确定你需要接收的数据的大小defaultTotal,当接收到的数据小于需要接收的数据时,多次执行Receive,直到recvTotal==defaultTotal。
参考技术B 你在发送端 设置一个标志,说明我发送的东西已经发送完毕,你接受的时候,判断接受的网络流中是否有这个标志,如果有,代表已经接收完整了。否则没有。追问

java写的服务端,我用java客户端测试的时候大数据量都能接收到,C#就接收不完整

追答

你在客户端接收的时候,判断接收完了没,没有接收完就继续接收啊!既然你可以接收数据,拿说明是对的,你没接收完整,是因为你没有判断你接收的数据到底接收完没有。

以上是关于C#Socket怎么才能接收完整的数据的主要内容,如果未能解决你的问题,请参考以下文章

Socket通信数据接收的时候不全,导致json解析失败。

C++ SOCKET发送结构体及接收

asp.net 用socket接收数据

socket接收16进制速度比较快

关于python中socket接收数据验证完整并且拼接方法

socket接收到数据增加no