Code Bye

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

reader = new BinaryReader(networkStream);

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

发帖的一会儿就找到答案了- – 之前找了很久~原来是len=newSocket.Receive(byte[]);….len就是接收到的数据长度, byte[]为载入数据

20分
 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并且读取长度重新玩.

这个长度你想获取需要等到数据全部获取完毕后再获取
引用 4 楼 chengbin0602 的回复:

这个长度你想获取需要等到数据全部获取完毕后再获取


10分
引用 1 楼 u011957542 的回复:

发帖的一会儿就找到答案了- – 之前找了很久~原来是len=newSocket.Receive(byte[]);….len就是接收到的数据长度, byte[]为载入数据

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

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


10分
得到的可能只是不分数据   –>   得到的可能只是部分数据

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

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


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#的TCPClient怎样获取接收到的数据长度?