当前位置: 代码迷 >> C# >> C#的TCPClient怎样获取接收到的数据长度?解决办法
  详细解决方案

C#的TCPClient怎样获取接收到的数据长度?解决办法

热度:504   发布时间:2016-05-05 05:09:22.0
C#的TCPClient怎样获取接收到的数据长度?
reader = new BinaryReader(networkStream);

我给服务器发送了数据后,服务器会回复相应的数据,但是找不到reader哪个方法是用于获取接收数据的长度的。。
------解决思路----------------------

 void receiveData()
        {
            try
            {
                while (tcpClient.Connected)
                {
                    myNetworkStream = tcpClient.GetStream();
                    int i = myNetworkStream.Read(buffer, 0, buffer.Length);
                    byte[] destinationArray = new byte[i];
                    Array.Copy(buffer, destinationArray, i);
                    write("rece     " + string.Join("-", destinationArray.Select(d => d.ToString("X2")).ToArray()));
                }
            }
            catch (Exception ex)
            {
                write(ex.Message);
            }
        }



 byte[] buffer = new byte[1024];


buffer缓冲 最大1024并且读取长度重新玩.
------解决思路----------------------
引用:
发帖的一会儿就找到答案了- - 之前找了很久~原来是len=newSocket.Receive(byte[]);....len就是接收到的数据长度, byte[]为载入数据


这是你的应用程序读取一个逻辑数据包的长度(注意跟tcp数据包长度没有直接关系)。

由于tcp是会自动分包、粘包的,因此你执行了一次 Receive 只后,得到的可能只是不分数据(即使是数据大小小于缓冲区大小也是一样),因此不能胡乱地用这个数据作为全部“就收数据”!你必须反复执行 Receive,知道你确定接收到数据结束标志为止,这时候才能说“接收数据......”这种判断。
------解决思路----------------------
得到的可能只是不分数据   -->   得到的可能只是部分数据

tcp数据包只有1000字节左右(比1024小),所以如果你认为每一组数据可以占1024字节,这反而是极大地浪费,因为反而是让数据包double了。

不过,根本不应该把tcp底层概念拿到高层次的应用程序上。在.net应用程序中,根据不同网络环境,最高效率的buffer大小不太一样。例如普通的互联网通讯,你把buffer大小设置为300k字节,可能是效果最好的;而在局域网上,则可能设置为3兆字节是最好的。一般来说,设置得大一些,总比设置得过小要好。
  相关解决方案