コード例 #1
0
        /// <inheritdoc />
        internal override HandleResult OnReceive <TSender>(TSender sender, IntPtr connId, byte[] data, ParseRequestBody <TSender, TRequestBodyType> parseRequestBody)
        {
            var cache = _dataReceiveAdapterCache.Get(connId);

            if (cache == null)
            {
                return(HandleResult.Error);
            }

            cache.Data.AddRange(data);
            if (cache.Data.Count > data.Length)
            {
                data = cache.Data.ToArray();
            }

            // 在data中搜索terminator
            var findList = _boyerMoore.SearchAll(data);

            if (findList.Count == 0)
            {
                // 没找到等下次
                return(HandleResult.Ok);
            }

            // 终止符长度
            var terminatorLength = _boyerMoore.PatternLength;

            // 最后位置
            var lastPosition = 0;

            foreach (var index in findList)
            {
                // 数量
                var bodyLength = index - lastPosition;

                // 得到一条完整数据包
                var bodyData = cache.Data.GetRange(lastPosition, bodyLength).ToArray();

                // 记录最后位置
                lastPosition += bodyLength + terminatorLength;

                // 包体解析对象从适配器子类中获取
                var obj = ParseRequestBody(bodyData);

                // 调用解析请求包体事件
                if (parseRequestBody.Invoke(sender, connId, obj) == HandleResult.Error)
                {
                    return(HandleResult.Error);
                }
            }

            if (lastPosition > 0)
            {
                // 清除已使用缓存
                cache.Data.RemoveRange(0, lastPosition);
            }

            return(HandleResult.Ignore);
        }
コード例 #2
0
        /// <inheritdoc />
        internal override HandleResult OnReceive <TSender>(TSender sender, IntPtr connId, byte[] data, ParseRequestBody <TSender, TRequestBodyType> parseRequestBody)
        {
            try
            {
                var cache = _dataReceiveAdapterCache.Get(connId);
                if (cache == null)
                {
                    return(HandleResult.Error);
                }

                cache.Data.AddRange(data);

                HandleResult result;
                do
                {
                    // 如果来的数据小于一个完整的包
                    if (cache.Data.Count < _packetSize)
                    {
                        // 下次数据到达处理
                        return(HandleResult.Ignore);
                    }

                    // 如果来的数据比一个完整的包长
                    if (cache.Data.Count >= _packetSize)
                    {
                        // 得到完整包并处理
                        var bodyData = cache.Data.GetRange(0, _packetSize).ToArray();

                        // 包体解析对象从适配器子类中获取
                        var obj = ParseRequestBody(bodyData);

                        // 调用解析请求包体事件
                        result = parseRequestBody.Invoke(sender, connId, obj);
                        if (result == HandleResult.Error)
                        {
                            break;
                        }

                        // 再移除已经读了的数据
                        cache.Data.RemoveRange(0, _packetSize);

                        // 没有数据了就返回了
                        if (cache.Data.Count == 0)
                        {
                            break;
                        }

                        // 剩余的数据下个循环处理
                    }
                } while (true);

                return(result);
            }
            catch (Exception /* ex*/)
            {
                return(HandleResult.Error);
            }
        }
コード例 #3
0
        /// <inheritdoc />
        internal override HandleResult OnReceive <TSender>(TSender sender, IntPtr connId, byte[] data, ParseRequestBody <TSender, TRequestBodyType> parseRequestBody)
        {
            var cache = _dataReceiveAdapterCache.Get(connId);

            if (cache == null)
            {
                return(HandleResult.Error);
            }

            cache.Data.AddRange(data);
            if (cache.Data.Count > data.Length)
            {
                data = cache.Data.ToArray();
            }

            var startLength = _startBoyerMoore.PatternLength;
            var endLength   = _endBoyerMoore.PatternLength;

            HandleResult result;
            var          lastPosition = 0;

            do
            {
                // 长度不够一个包等下次再来
                if (data.Length - lastPosition < startLength + endLength)
                {
                    result = HandleResult.Ok;
                    break;
                }

                // 搜索起始标志
                var startPosition = _startBoyerMoore.Search(data, lastPosition);

                // 是否找到了
                if (startPosition == -1)
                {
                    result = HandleResult.Error;
                    break;
                }

                startPosition = lastPosition + startPosition + startLength;

                // 搜索结束标志, 从起始位置+起始标志长度开始找
                var count = _endBoyerMoore.Search(data, startPosition);
                if (count == -1)
                {
                    result = HandleResult.Ignore;
                    break;
                }

                // 得到一条完整数据包
                var bodyData = cache.Data.GetRange(startPosition, count).ToArray();
                lastPosition += count + startLength + endLength;

                // 包体解析对象从适配器子类中获取
                var obj = ParseRequestBody(bodyData);

                // 调用解析请求包体事件
                if (parseRequestBody.Invoke(sender, connId, obj) == HandleResult.Error)
                {
                    result = HandleResult.Error;
                    break;
                }

                // 下次继续解析
            } while (true);

            if (lastPosition > 0)
            {
                // 再移除已经读了的数据
                cache.Data.RemoveRange(0, lastPosition);
            }

            return(result);
        }
コード例 #4
0
        /// <inheritdoc />
        internal override HandleResult OnReceive <TSender>(TSender sender, IntPtr connId, byte[] data, ParseRequestBody <TSender, TRequestBodyType> parseRequestBody)
        {
            try
            {
                var cache = _dataReceiveAdapterCache.Get(connId);
                if (cache == null)
                {
                    return(HandleResult.Error);
                }

                cache.Data.AddRange(data);

                HandleResult result;
                do
                {
                    // 数据小于包头长度
                    if (cache.Data.Count < _headerSize)
                    {
                        return(HandleResult.Ok);
                    }

                    // 包头
                    var header = cache.Data.GetRange(0, _headerSize).ToArray();

                    // 包体长度从适配器子类中获取
                    var bodySize = GetBodySize(header);

                    // 完整的包长度(含包头和完整数据的大小)
                    var fullSize = bodySize + _headerSize;

                    // 判断最大封包长度
                    if (_maxPacketSize != 0 && fullSize > _maxPacketSize)
                    {
                        // 超过断开
                        return(HandleResult.Error);
                    }

                    // 如果来的数据小于一个完整的包
                    if (cache.Data.Count < fullSize)
                    {
                        // 下次数据到达处理
                        return(HandleResult.Ignore);
                    }

                    // 如果来的数据比一个完整的包长
                    if (cache.Data.Count >= fullSize)
                    {
                        // 得到完整包并处理
                        var bodyData = cache.Data.GetRange(_headerSize, bodySize).ToArray();

                        // 包体解析对象从适配器子类中获取
                        var obj = ParseRequestBody(header, bodyData);

                        // 调用解析请求包体事件
                        result = parseRequestBody.Invoke(sender, connId, obj);
                        if (result == HandleResult.Error)
                        {
                            break;
                        }

                        // 再移除已经读了的数据
                        cache.Data.RemoveRange(0, fullSize);

                        // 没有数据了就返回了
                        if (cache.Data.Count == 0)
                        {
                            break;
                        }

                        // 剩余的数据下个循环处理
                    }
                } while (true);

                return(result);
            }
            catch (Exception /* ex*/)
            {
                return(HandleResult.Error);
            }
        }