第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > Socket系列3 Socket服务端开发 数据的接收和发送

Socket系列3 Socket服务端开发 数据的接收和发送

时间:2023-08-07 21:21:50

相关推荐

Socket系列3 Socket服务端开发 数据的接收和发送

利用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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。