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并且读取长度重新玩. |
这个长度你想获取需要等到数据全部获取完毕后再获取
|
|
顶 |
|
10分 |
这是你的应用程序读取一个逻辑数据包的长度(注意跟tcp数据包长度没有直接关系)。 由于tcp是会自动分包、粘包的,因此你执行了一次 Receive 只后,得到的可能只是不分数据(即使是数据大小小于缓冲区大小也是一样),因此不能胡乱地用这个数据作为全部“就收数据”!你必须反复执行 Receive,知道你确定接收到数据结束标志为止,这时候才能说“接收数据……”这种判断。 |
10分 |
得到的可能只是不分数据 –> 得到的可能只是部分数据
tcp数据包只有1000字节左右(比1024小),所以如果你认为每一组数据可以占1024字节,这反而是极大地浪费,因为反而是让数据包double了。 不过,根本不应该把tcp底层概念拿到高层次的应用程序上。在.net应用程序中,根据不同网络环境,最高效率的buffer大小不太一样。例如普通的互联网通讯,你把buffer大小设置为300k字节,可能是效果最好的;而在局域网上,则可能设置为3兆字节是最好的。一般来说,设置得大一些,总比设置得过小要好。 |