Socket系列3 Socket服务端开发 数据的接收和发送
生活随笔
收集整理的這篇文章主要介紹了
Socket系列3 Socket服务端开发 数据的接收和发送
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
利用SocketAsyncEventArgs類來實現Socket通訊,
代碼參考?https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socketasynceventargs?redirectedfrom=MSDN&view=netframework-4.8
期中數據粘包是用的固定包頭加數據長度解決的.
/// <summary>/// 接受數據/// </summary>/// <param name="data">接受數據</param>/// <param name="length">接受數據長度</param>public void RecveData(byte[] data, int length){if (!isAction)return;if (0 == length)return;if (currentDataLength < headLength){HandleHeadData(data, length);}else{HandleBodyData(data, length);}}/// <summary>/// 處理包頭/// </summary>/// <param name="data"></param>/// <param name="length"></param>private void HandleHeadData(byte[] data, int length){if (!isAction)return;try{var tempLength = currentDataLength + length;if (tempLength < headLength){Buffer.BlockCopy(data, 0, headData, currentDataLength, length);currentDataLength += length;}else{var tempHandLength = headLength - currentDataLength;Buffer.BlockCopy(data, 0, headData, currentDataLength, tempHandLength);currentDataLength += tempHandLength;bodyLength = GetBodyDataLenght(headData);bodyData = new byte[bodyLength];var tempLenght = length - tempHandLength;if (tempLenght > 0){var tempBodyData = new byte[tempLenght];Buffer.BlockCopy(data, tempHandLength, tempBodyData, 0, tempLenght);RecveData(tempBodyData, tempLenght);}else{HandlComplete();}}}catch (Exception e){Log.LogError(e);}}/// <summary>/// 處理包體/// </summary>/// <param name="data"></param>/// <param name="lenth"></param>private void HandleBodyData(byte[] data, int lenth){if (!isAction)return;if (null == bodyData)return;var tempDataLength = currentDataLength - headData.Length + lenth;if (tempDataLength == bodyLength){Buffer.BlockCopy(data, 0, bodyData, currentDataLength - headLength, lenth);currentDataLength += lenth;HandlComplete();}else if (tempDataLength > bodyLength){var tempLength = bodyLength - (currentDataLength - headData.Length);Buffer.BlockCopy(data, 0, bodyData, currentDataLength - headLength, tempLength);currentDataLength += tempLength;HandlComplete();var tempOverLength = lenth - tempLength;var tempOverData = new byte[tempOverLength];Buffer.BlockCopy(data, tempLength, tempOverData, 0, tempOverLength);RecveData(tempOverData, tempOverLength);}else{Buffer.BlockCopy(data, 0, bodyData, currentDataLength, lenth);currentDataLength += lenth;}} 處理數據工程地址
鏈接:https://pan.baidu.com/s/1lNNpTBNegRN411m0Lnd47A
提取碼:079f
轉載于:https://www.cnblogs.com/PandaHome/p/10996731.html
總結
以上是生活随笔為你收集整理的Socket系列3 Socket服务端开发 数据的接收和发送的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载】基于Linux命令行KVM虚拟机
- 下一篇: vuex第三弹vuex之actions(