協議種類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。