接收過濾器(ReceiveFilter)用於將接收到的二進制數據轉化成請求實例(RequestInfo)。
實現一個接收過濾器(ReceiveFilter), 你需要實現接口 IReceiveFilter:
public interface IReceiveFilter<TRequestInfo>
where TRequestInfo : IRequestInfo
{
/// <summary>
/// Filters received data of the specific session into request info.
/// </summary>
/// <param name="readBuffer">待讀取的緩沖數據.</param>
/// <param name="offset">這個待讀取緩沖中當前接收數據的偏移量</param>
/// <param name="length">當前接收數據的長度</param>
/// <param name="toBeCopied">if set to <c>true</c> [to be copied].</param>
/// <param name="rest">沒有被解析的數據的長度</param>
/// <returns></returns>
TRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest);
/// <summary>
/// Gets the size of the left buffer.
/// </summary>
/// <value>
/// 接收過濾器已緩存數據的長度
/// </value>
int LeftBufferSize { get; }
/// <summary>
/// Gets the next receive filter.
/// </summary>
IReceiveFilter<TRequestInfo> NextReceiveFilter { get; }
/// <summary>
/// Resets this instance to initial state.重置這個實例到初始化狀態
/// </summary>
void Reset();
}
TRequestInfo: 類型參數 "TRequestInfo" 是你要在程序中使用的請求類型(RequestInfo);
LeftBufferSize: 該接收過濾器已緩存數據的長度;
NextReceiveFilter: 當下一塊數據收到時,用於處理數據的接收過濾器實例;
Reset(): 重設接收過濾器實例到初始狀態;
Filter(....): 該方法將會在 SuperSocket 收到一塊二進制數據時被執行,接收到的數據在 readBuffer 中從 offset 開始, 長度為 length 的部分。
TRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest);
readBuffer: 接收緩沖區, 接收到的數據存放在此數組里
offset: 接收到的數據在接收緩沖區的起始位置
length: 本輪接收到的數據的長度
toBeCopied: 表示當你想緩存接收到的數據時,是否需要為接收到的數據重新創建一個備份而不是直接使用接收緩沖區
rest: 這是一個輸出參數, 它應該被設置為當解析到一個為正的請求后,接收緩沖區還剩余多少數據未被解析
這兒有很多種情況需要你處理:
當你在接收緩沖區中找到一條完整的請求時,你必須返回一個你的請求類型的實例.
當你在接收緩沖區中沒有找到一個完整的請求時, 你需要返回 NULL.
當你在接收緩沖區中找到一條完整的請求, 但接收到的數據並不僅僅包含一個請求時,設置剩余數據的長度到輸出變量 "rest". SuperSocket 將會檢查這個輸出參數 "rest", 如果它大於 0, 此 Filter 方法 將會被再次執行, 參數 "offset" 和 "length" 會被調整為合適的值.