C# TCP通信以及报文格式和接收处理

       目前有一个小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

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的 C# TCP 客户端示例代码: ```csharp using System; using System.Net.Sockets; class Program { static void Main(string[] args) { try { // 创建一个 TcpClient 实例 TcpClient client = new TcpClient(); // 连接服务器 client.Connect("127.0.0.1", 8888); // 获取网络流 NetworkStream stream = client.GetStream(); // 发送数据 byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, Server!"); stream.Write(data, 0, data.Length); // 接收数据 data = new byte[256]; int bytes = stream.Read(data, 0, data.Length); string responseData = System.Text.Encoding.UTF8.GetString(data, 0, bytes); Console.WriteLine("Received: {0}", responseData); // 关闭连接 stream.Close(); client.Close(); } catch (Exception ex) { Console.WriteLine("Exception: {0}", ex); } Console.ReadLine(); } } ``` 在上面的示例代码中,我们使用了 `TcpClient` 类来创建一个 TCP 客户端实例,并使用 `Connect` 方法连接到服务器。然后,我们使用 `GetStream` 方法获取网络流,以便发送和接收数据。在发送数据时,我们将字符串转换成字节数组,并使用 `Write` 方法将数据发送到服务器。在接收数据时,我们创建一个字节数组来存储接收到的数据,并使用 `Read` 方法从网络流中读取数据。最后,我们将接收到的数据转换回字符串,并将其输出到控制台。最后,我们关闭流和客户端连接。 请注意,上面的示例代码仅用于演示如何创建一个简单的 TCP 客户端。在实际开发中,您需要考虑到更多的异常情况和错误处理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值