目前有一个小demo,模拟的是一台机子上的服务器和客户端的发送和接收消息,我打包上传,有兴趣的可以下载看看,网址是:Tcp通信—本机发送接收 https://download.csdn.net/download/yuanyuanluoluo/10356566
项目中用的就是demo中的部分代码,连接上后,就是接收报文,处理报文,报文格式具体要和发送端协商,我这里的报文格式是这样的。
一组报文格式如下:
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
https://blog.csdn.net/yuanyuanluoluo/article/details/79984356
https://blog.csdn.net/yuanyuanluoluo/article/details/79984356