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

本文介绍如何使用SocketAsyncEventArgs类实现Socket通讯,重点讲解了通过固定包头加数据长度的方法解决数据粘包问题。文章提供了处理包头和包体的代码示例,并附有完整的工程地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值