什么是AppSession?
AppSession 代表一個和客戶端的邏輯連接,基於連接的操作應該定義於在該類之中。你可以用該類的實例發送數據到客戶端,接收客戶端發送的數據或者關閉連接。同時可以保存客戶端所關聯的數據。
什么是AppServer?
AppServer 代表了監聽客戶端連接,承載TCP連接的服務器實例。理想情況下,我們可以通過AppServer實例獲取任何你想要的客戶端連接,服務器級別的操作和邏輯應該定義在此類之中。
第一步:創建你的AppSession
為什么要創建AppSession呢,本人認為,快速入門系統,以下三點足夠你用的了。
- 需要重新實現會話創建、收到未知的協議數據的時候、處理異常等可重載的方法,像異常,只是做了記錄日志操作,部分方法都是不處理。
- 需要關聯一些數據,同時AppSession提供了可存放最多10個數據的Items的屬性(IDictionary<object, object>類型)。
- 需要其他對象來實現自定義協議。
1 // 在下面的代碼中,當一個新的連接連接上時,服務器端立即向客戶端發送歡迎信息。 這段代碼還重寫了其它AppSession的方法用以實現自己的業務邏輯。 2 public class TelnetSession : AppSession<TelnetSession> 3 { 4 // 重載OnSessionStarted函數,贊同於appServer.NewSessionConnected += NewSessionConnected 5 protected override void OnSessionStarted() 6 { 7 // 會話鏈接成功后的邏輯部分。 8 this.Send("Welcome to SuperSocket Telnet Server"); 9 } 10 11 protected override void HandleUnknownRequest(StringRequestInfo requestInfo) 12 { 13 // 收到未知請求的邏輯部分 14 this.Send("Unknow request"); 15 } 16 17 protected override void OnSessionClosed(CloseReason reason) 18 { 19 // 會話關閉后的邏輯代碼 20 base.OnSessionClosed(reason); 21 } 22 } 23 24 // 你可以根據你的業務需求來給Session類增加新的屬性 25 public class PlayerSession :AppSession<PlayerSession> 26 { 27 public int GameHallId { get; internal set; } 28 29 public int RoomId { get; internal set; } 30 }
上述代碼中,兩個自定義的AppSession都是使用的命令行協議。由於泛型約束,在自定義AppSession的時候,泛型TAppSession一定要指定所定義的類,很多朋友像命令無法加載啦、服務器啟動不起來等等,都是因為這里定義錯誤造成的。
有朋友就會問了,為什么不能直接繼承AppSession呢?不好意思,快速入門系列不做補腦,在第一章的內容中已經說過。
第二步:創建你的AppServer類型
如果你創建自己的AppSession並希望使用它,那么必須要創建所對應的AppServer。
1 // 現在 TelnetSession 將可以用在 TelnetServer 的會話中,也有很多方法可以重載 2 public class TelnetServer : AppServer<TelnetSession> 3 { 4 protected override bool Setup(IRootConfig rootConfig, IServerConfig config) 5 { 6 // 對家配置文件進行相應的修改。 7 return base.Setup(rootConfig, config); 8 } 9 10 protected override void OnStartup() 11 { 12 // 服務器啟動的邏輯部分 13 base.OnStartup(); 14 } 15 16 protected override void OnStopped() 17 { 18 // 停止服務器的邏輯部分 19 base.OnStopped(); 20 } 21 }
第三步:啟動你的服務器
還記錄上一節我們講的內容,如何啟動你的SS么?
// 第一種方法,代碼啟動。 static void Main(string[] args) { // 注意是TelnetServer var appServer = new TelnetServer(); appServer.Setup(2012); // 開始監聽 appServer.Start(); while (Console.ReadKey().KeyChar != 'q') { Console.WriteLine(); continue; } // 停止服務器。 appServer.Stop(); } // 第二種方法,通過配置啟動,需要注意的是,一定要注意配置好,不然啟動會失敗的,這里沒有判斷初始化成功與否,可以看源碼里面的例子。 static void Main(string[] args) { var bootstrap = BootstrapFactory.CreateBootstrap(); bootstrap.Initialize(); bootstrap.Start(); while (Console.ReadKey().KeyChar != 'q') { Console.WriteLine(); continue; } bootstrap.Stop(); }
通過配置啟動,需要注意的是,一定要配置正確,不然無法正常啟動你的AppServer,其中serverType="AppServer的完整名稱, 類所在程序集",如:serverType="SuperSocket.QuickStart.TelnetServer_StartByConfig.TelnetServer, SuperSocket.QuickStart.TelnetServer_StartByConfig"。
到此,如何啟動SS以及如果簡單的實現你的AppServer和AppSession並啟動你的AppServer完成,在下一章節中,我們講解如果關聯Command。
優點
實現你自己的AppSession和AppServer允許你根據你業務的需求來方便的擴展SuperSocket,你可以綁定session的連接和斷開事件,服務器實例的啟動和停止事件。你還可以在AppServer的Setup方法中讀取你的自定義配置信息。總而言之,這些功能讓你方便的創建一個你所需要的socket服務器成為可能。
參考文獻:http://docs.supersocket.net/v1-6/zh-CN/Implement-your-AppServer-and-AppSession