利用SocketAsyncEventArgs类来实现Socket通讯,
期中数据粘包是用的固定包头加数据长度解决的.


/// <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