C#高性能大容量SOCKET併發(八):通信協議

原文: C#高性能大容量SOCKET併發(八):通信協議

協議種類sql

開發Socket程序有兩種協議類型,一種是用文本描述的,相似HTTP協議,定義字符集,好處是兼容性和調試方便,缺點是解析文本會損耗一些性能;一種是用Code加結構體,定義字節順序,好處是性能高,缺點是兼容性和調試不方便。這個能夠根據應用場景靈活選擇,若是您的應用相對穩定,需求變化少,性能要求高,則可使用Code加結構體的方式。若是您的應用須要不停的擴充功能,可是對性能要求不苛刻,則可使用文本解析的方式。這兩種協議有兩個比較典型的應用場景,Code加結構體更多應用在中間件上,由於協議的封裝都是透明的,不須要聯調,並且性能要求較高;文本解析則更多應用在外部交互上,如和設備、手機通信,須要聯調,可是性能要求沒那麼高。編程

咱們Demo是採用文本解析的方式,具體能夠根據應用靈活選擇。服務器

定義協議有如下注意點(方便不一樣平臺接入)。網絡

字節順序併發

不一樣硬件平臺或操做系統下,字節順序是不一致的,有的是高位在前,低位在後,有的則是低位在前。Windows是低位在前,高位在後,每一個平臺下都有函數實現字節轉換。TCP/IP定義的字節順序是高位在前、低位在後,可使用IPAddress類的函數

        //
        // 摘要:
        //     將整數值由網絡字節順序轉換爲主機字節順序。
        //
        // 參數:
        //   network:
        //     以網絡字節順序表示的要轉換的數字。
        //
        // 返回結果:
        //     以主機字節順序表示的整數值。
        [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
        public static int NetworkToHostOrder(int network);
        //
        // 摘要:
        //     將長值由網絡字節順序轉換爲主機字節順序。
        //
        // 參數:
        //   network:
        //     以網絡字節順序表示的要轉換的數字。
        //
        // 返回結果:
        //     以主機字節順序表示的長值。
        [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
        public static long NetworkToHostOrder(long network);
        //
        // 摘要:
        //     將短值由網絡字節順序轉換爲主機字節順序。
        //
        // 參數:
        //   network:
        //     以網絡字節順序表示的要轉換的數字。
        //
        // 返回結果:
        //     以主機字節順序表示的短值。
        [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
        public static short NetworkToHostOrder(short network);

來實現網絡字節順序轉爲本地字節順序,反之能夠調用性能

        //
        // 摘要:
        //     將整數值由主機字節順序轉換爲網絡字節順序。
        //
        // 參數:
        //   host:
        //     以主機字節順序表示的要轉換的數字。
        //
        // 返回結果:
        //     以網絡字節順序表示的整數值。
        public static int HostToNetworkOrder(int host);
        //
        // 摘要:
        //     將長值由主機字節順序轉換爲網絡字節順序。
        //
        // 參數:
        //   host:
        //     以主機字節順序表示的要轉換的數字。
        //
        // 返回結果:
        //     以網絡字節順序表示的長值。
        public static long HostToNetworkOrder(long host);
        //
        // 摘要:
        //     將短值由主機字節順序轉換爲網絡字節順序。
        //
        // 參數:
        //   host:
        //     以主機字節順序表示的要轉換的數字。
        //
        // 返回結果:
        //     以網絡字節順序表示的短值。
        public static short HostToNetworkOrder(short host);

來實現本地字節順序轉爲網絡字節順序。

更流行的作法是使用網絡字節順序,這樣規範統一。咱們這裏使用Windows字節順序,即低位在前、高位在後,和網絡字節順序恰好相反。學習

字符集this

字符集最合適的就是使用UTF-8,這個編碼是免費的,對於某些不支持中文的嵌入式系統,全英文能夠不須要轉換就是UTF-8格式,對於跨平臺具備優點。編碼

數據包格式

Code加結構體、文本解析兩種協議風格都是統一使用相同的數據包格式,即先發一個4字節的長度,後面跟着是內容,下一個也是先發一個4字節長度,接着是內容。結構體能夠定義爲文件流結構體,採用字節對齊。

協議樣本

Active:檢測鏈接(心跳包)

客戶端->服務器
{
[Request]
Command=Active
}
服務器->客戶端
{
[Response]
Command= Active
Code= Error Code#錯誤碼
Message=Message#若是出錯,返回錯誤描述信息
}


DEMO下載地址:http://download.csdn.net/detail/sqldebug_fan/7467745
免責聲明:此代碼只是爲了演示C#完成端口編程,僅用於學習和研究,切勿用於商業用途。水平有限,C#也屬於初學,錯誤在所不免,歡迎指正和指導。郵箱地址:fansheng_hx@163.com。

相關文章
相關標籤/搜索