咱們接收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