/// <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); }
/// <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); } }
/// <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); }
/// <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); } }