TCP socket通信解决连包问题详解

一个多月都在做socket通信,刚开始一点都没接触过,我们老大刚开始说要我弄一个IM出来,我想太恐怖了,什么视频语音在我印象中都是些高深的东西啊!我怎么可能做的出来,和他聊了一个下午,听了很多,我就觉得他是在忽悠我,不过没办法刚来只能他说什么我做什么了,做到现在真不容易,特别是现在卡在语音杂音问题上很是郁闷,希望有哪位高手给小弟一个解决方案,谢谢了。

     遇到的问题很多,开始是怎么处理异步传输,一些异常的处理,做视频的时候怎么压缩,怎么控制大小,语音主要是杂音。

     开始我把视频和语音是分开做的,并且测试一晚也没什么事,后面就是在一起传的时候碰到了连包和段包的问题,我用小数据量测的果然有数据包断开了,比如123456789,有些缓冲区里面就有123456789123,这样的数据包,数据包接收的时候是一个个完整的,只是在放到一个固定大小的缓冲区里面的时候它就有些呗截取了,这里提供两种解决方法。

一、数据包格式为 025681 0x01 音频数据

     包头固定十位数字或者更多,025681指数据包长25681个字节,0x01表示数据报类型,这样每次从缓冲区里面读出包头信息然后取出实际数据,取完后就从缓冲区里面清除掉,数据包不够包长的不处理等下次有了一个包长再处理,这种需要在每次数据前面加上一个固定六位的表示包长的数字,用这个方法

byte[] arr = new byte[6]
                {
                    byte.Parse(stri.Length >= 6 ? stri[stri.Length - 6].ToString() : "0"),
                    byte.Parse(stri.Length >= 5 ? stri[stri.Length - 5].ToString() : "0"),
                    byte.Parse(stri.Length >= 4 ? stri[stri.Length - 4].ToString() : "0"),
                    byte.Parse(stri.Length >= 3 ? stri[stri.Length - 3].ToString() : "0"),
                    byte.Parse(stri.Length >= 2 ? stri[stri.Length - 2].ToString() : "0"),
                    byte.Parse(stri.Length >= 1 ? stri[stri.Length - 1].ToString() : "0")
                };

二、新数据包格式 7 1 25681 音频数据 7表示包头总长度 固定一位,1表示数据类型 固定两位,25681表述音频数据长度最多6位。

     这种比较灵活一点,就是在前面用一个数字表示包头长,后面两位表示包类型,在后面就是包长度,这样就可以不需要每次都加上面一段代码了,

     可以自行扩张。

原文地址:https://www.cnblogs.com/yangleiWPF/p/1687395.html