利用SocketAsyncEventArgs类来实现Socket通讯,
代码参考/en-us/dotnet/api/.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;}}
处理数据
工程地址
链接:/s/1lNNpTBNegRN411m0Lnd47A
提取码:079f