咱们接收Socket字节流数据通常都会定义一个数据包协议( 协议号,长度,内容),因为Socket接收数据是连续的,对方发两个包过来,Socket的 Recive事件有可能只触发一次或触发三次,也就是你们听到的粘包,为解决这个粘包,因此咱们必要建一个字节缓冲区,将全部的接收到的字节流全放到这个缓冲区内 由这个缓冲区来分隔每一个数据包的内容。数组
这份代码也是为论坛某我的解决串口接收数据包时而写的。很少说了上代码:socket
调用列子:post
- private ByteQueue queue = new ByteQueue();
- private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
- {
- int len = serialPort1.BytesToRead;
- if (len > 0)
- {
- byte[] temp = new byte[len];
- serialPort1.Read(temp, 0, len);
- queue.Enqueue(temp);
- while (queue.Find())
- {
- int length = queue.GetLength();
- byte[] readBuffer = new byte[len];
- queue.Dequeue(readBuffer, 0, length);
- OnReceiveData(readBuffer);
- }
-
- }
-
- }
上面的字节接收容器是用List来处理为方便进出字节后移除整个数据包的字节数据,固然更高效的应用byte[] 数组做成环形缓冲会好不少相对应的写法也会难一些,ui