TCPsocket通信解决连包问题详解
⼀个多⽉都在做socket通信,刚开始⼀点都没接触过,我们⽼⼤刚开始说要我弄⼀个IM出来,我想太恐怖了,什么视频语⾳在我印象中都是些⾼深的东西啊!我怎么可能做的出来,和他聊了⼀个下午,听了很多,我就觉得他是在忽悠我,不过没办法刚来只能他说什么我做什么了,做到现在真不容易,特别是现在卡在语⾳杂⾳问题上很是郁闷,希望有哪位⾼⼿给⼩弟⼀个解决⽅案,谢谢了。
遇到的问题很多,开始是怎么处理异步传输,⼀些异常的处理,做视频的时候怎么压缩,怎么控制⼤⼩,语⾳主要是杂⾳。
开始我把视频和语⾳是分开做的,并且测试⼀晚也没什么事,后⾯就是在⼀起传的时候碰到了连包和段包的问题,我⽤⼩数据量测的果然有数据包断开了,⽐如123456789,有些缓冲区⾥⾯就有123456789123,这样的数据包,数据包接收的时候是⼀个个完整的,只是在放到⼀个固定⼤⼩的缓冲区⾥⾯的时候它就有些呗截取了,这⾥提供两种解决⽅法。
⼀、数据包格式为 025681 0x01 ⾳频数据
socket通信在哪一层
包头固定⼗位数字或者更多,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位。
这种⽐较灵活⼀点,就是在前⾯⽤⼀个数字表⽰包头长,后⾯两位表⽰包类型,在后⾯就是包长度,这样就可以不需要每次都加上⾯⼀段代码了,
可以⾃⾏扩张。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。