前面已經了解了supersocket的一些基本的屬性及相關的方法,下面就進入重點的學習內容,通信協議。在沒有看官方的文檔之前,對於協議的理解首先想到的是TCP和UDP協議。TCP 和 UDP 是傳輸層協議。在Socket程序中僅僅定義了傳輸層協議是不能讓網絡的兩端進行通信的。我們需要定義應用層通信協議把我們接收到的二進制數據轉化成程序能理解的請求。
命令行協議是一種被廣泛應用的協議。一些成熟的協議如 Telnet, SMTP, POP3 和 FTP 都是基於命令行協議的。 在SuperSocket 中,如果我們沒有自定義協議的話,SuperSocket默認的協議就是命令行協議 ,這樣就極大的簡化了基於此類協議的開發。命令行協議定義了每個請求必須以回車換行結尾 "\r\n"。
SuperSocket設計了兩個RequestInfo類:StringRequestInfo 和BinaryRequestInfo。
1、如果我們在 SuperSocket 中使用命令行協議,所有接收到的數據將會翻譯成 StringRequestInfo 實例。
我們來看一下StringRequestInfo的定義:
public class StringRequestInfo {
public string Key { get; }
public string Body { get; }
public string[] Parameters { get; }
/* Other properties and methods */
}
StringRequestInfo有三個屬性, Key是這個命令行的命令名,是用於關聯Command的字符串;Data是一個命令的參數部分;Parameters是一個命令的參數列表。
因為CommandLineProtocol默認的CommandParser是用空格來區分命令名和參數,所以當客戶端發送數據
"ADD 3 4" + 換行符
到服務器端時,服務器端會收到一個StringRequestInfo的實例cmdInfo, 實例各個屬性值如下:
cmdInfo.Key = "ADD";
cmdInfo.Data = "3 4";
cmdInfo.Parameters = {"3 4"}
為了更好理解和明白,我們看一下調試的參數:
運行結果
看到這里StringRequestInfo 實例是不是已經明白了。其實SuperSocket不僅僅只能解析這些這種內置命令行協議,在不同的業務場景發生請求的格式可能都不一樣。在某些協議中命令和參數,參數和參數之間的分隔符不是用空格,而是其它字符,在這種情況我們就需要重新設置CommandLineProtocol的CommandParser了。SuperSocket內建的BasicCommandParser可以直接設置命令名和參數,參數與參數之間的分隔符。
例如:協議命令名和參數之間用":"分隔,參數與參數之間用","分割,形如"ADD:3,4"。要實現這樣的命令解析,我們只需用":"和","為參數來實例化BasicCommandParser然后賦值給CommandLineProtocol實例即可,代碼如下:
MyServer類修改位置:


如果想更深度的定義請求的格式, 我們可以基於接口 IRequestInfoParser 來實現一個 TestRequestInfoParser 類, 然后當實例化 CommandLineReceiveFilterFactory 時傳入擬定一個 TestRequestInfoParser 實例:
例如格式變更為HL:ECHO:data數據

測試結果:

2、如果我們在SuperSocket中使用二進制協議,所有接收到的數據將會翻譯成BinaryRequestInfo實例。官方對這個協議的使用並沒有具體描述,后期需要使用時進行具體學習了解。
