• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#TCP通信自定义包头

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

winform经常用到TCP通信,使用TCP通信协议的好处大家都知道,数据传送可靠,不会丢失,也就是不会丢包。但是使用TCP协议接收数据比有点麻烦,数据会粘包。为了保证数据正常的解析,这里使用最大众的解决方法,在发送的数据包前面定义一个2个字节长度的包头,根据包头可以知道后续数据的长度。具体做法是发送端发送数据时同时将数据长度写到包头,接收端默认读取两个字节,有数据来它便读到了数据包的长度,接着通过数据包的长度继续读取后续的数据。这样就可以解决数据的粘包问题了。

发送端

          string msgs="aaa";
         byte[] msg = Encoding.Default.GetBytes(msgs);           
                int length = msg.Length;
                short lengthall = (short)(length + 2);
                byte[] lengthByte =  System.BitConverter.GetBytes(lengthall);//short转字节调换位置
                byte tmp = lengthByte[0];
                lengthByte[0] = lengthByte[1];
                lengthByte[1] = tmp;
byte[] all = lengthByte.Concat(msg).ToArray(); //然后将字节数组写入网络流 if (bw != null && tcpClient.Connected==true) { bw.Write(all); bw.Flush(); } else { this.Reconnect(); }

接收端

  while (true)
            {
                byte[] BytesLenth = null;
                byte[] BytesContent = null;
                if (br == null) continue;                
                    BytesLenth = br.ReadBytes(2);
                    //字节转int调换位置
                    byte tmp = BytesLenth[0];
                    BytesLenth[0] = BytesLenth[1];
                    BytesLenth[1] = tmp;

                    int lenth = BitConverter.ToInt16(BytesLenth, 0);
                    BytesContent = br.ReadBytes(lenth - 2);
                    string conContent = Encoding.Default.GetString(BytesContent);              
            }

这里需要注意一个问题,贴的代码中int转字节或者字节转int的时候都把字节数组中的两个数据进行了对调,这个是特殊情况,在与C或者C++程序通信的时候必须这样才能正常解析,估计是不同语言读取字节数组的顺序不一样导致的。如果是C#编的客户端程序之间通信,不需要这样对调位置。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#添加注释模板发布时间:2022-07-18
下一篇:
【转载】C#使用Select方法快速获取List集合集合中某个属性的所有值集合 ...发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap