c#之间的TCP通信以及报文格式和接收处理

目前有一个小demo,模拟的是一台机子上的服务器和客户端的发送和接收消息,我打包上传,有兴趣的可以下载看看,网址是:Tcp通信—本机发送接收
https://download.csdn.net/download/yuanyuanluoluo/10356566

项目中用的就是demo中的部分代码,连接上后,就是接收报文,处理报文

报文格式具体要和发送端协商,我这里的报文格式是这样的

一组报文
c#之间的TCP通信以及报文格式和接收处理_第1张图片

1.一个float,表示这组报文的总字节数
2.一个float,表示变量名的总字节数
3.多个char,每一个变量名
4.一个float,表示数据的总字节数
5.多个double,每一个变量对应的数值

下面是解析一组报文的核心代码:

                    //对data清零  
                    recvData = new byte[1024];
                   //获取收到的数据的长度  
                    recvLen = clientSocket.Receive(recvData);
                    totalLength = BitConverter.ToInt32(recvData, index);//报文的总长
                    index += 4;
                    variableCount = BitConverter.ToInt32(recvData, index);//变量名总字节数
                    index += 4;
                    string c = Encoding.ASCII.GetString(recvData, index, variableCount);//变量名
                    string[] arr = c.Split('#');//变量名
                    index += variableCount;
                    this.inputntnormal = BitConverter.ToInt32(recvData, index);
                    index += 4;
                    double a = BitConverter.ToDouble(recvData, index);//每个变量名对应的double值
                    index += 8;

后来 接收并存储完数据后,显示发现,由于网络不稳定,不一定会一次就正好发一组报文,有可能网络好,一次发了多个报文,有可能不好,发好几次才发完一组报文,所以还要把接收的数据处理一下,这里逻辑有点绕,多亏我同事的鼎力相助,不然没写过的我估计要想好久。

大致思路是:
接收报文,获取该组报文的总长度,跟接收到的长度进行比较,
接收了多组报文,先截取第一组报文,处理完后,再判断第二组报文是否接收完全,完全则处理,不完全则保留下来,再次循环接收下一次数据,把下次接收的数据追加到保留的数据后面,重新组成一个完整的报文。

当时我模拟一次收到两个半报文处理,但是始终跳不出思维怪圈,找不到规律 ,不知道怎么用循环,最后还是同事帮助下,用一个while循环,里面一个if,if条件不满足就跳出while循环,while循环的条件是剩余的数据长度大于报文的长度,就是后面有一个完整的报文。跳出while循环则证明剩余的已经不是一个完整的报文了,需要在此接收数据,并且追加数据

有兴趣的可以下载看一下:接收的报文处理
https://download.csdn.net/download/yuanyuanluoluo/10356722

你可能感兴趣的:(c#之间的TCP通信以及报文格式和接收处理)