前情提要
筆者在上篇把該有的Socket
底層元件相關的程式碼依照分類貼出,筆者分幾個筆記來詳細解釋相關設計概念,此篇以最上層Client端解析封包作業為例,解釋筆者的設計概念。
內容
筆者用過幾個Event設計的原件,基本上可以從dotnet
預設的套件就可以看出諸多此類的設計,筆者自己也加工過幾個,例:SMTP Send Mail
,使用ProcessInfo
執行bat file
皆使用上此類技巧。
以筆者使用的NetCoreServer來說,他所設計的方式是繼承他原有的物件,將幾個socket
發生的事件處裡邏輯封裝成virtual
的形式,你可以override
成自己想要的樣子,以套件github頁面上提供的範例來說,由幾個處裡事件方法是可以複寫的,如下:
- Server/Session/Client
- OnConnected
- OnDisconnected
- OnReceived
- OnError
筆者將擴大成將常用的事件定義成契約interface
,才會出現IServer
及IClient
1 | public interface IServer |
1 | public interface IClient |
筆者在中間有換過一次底層套件,NetCoreServer還是第二次套用的底層元件,為這個套件調整過一次上述Interface,不過因為上層相依的部份只有OnReceive
,筆者當初的想法是對於最上層Client使用端來說只有解析封包這件事是客製化的,其他行為是不會改變的,因此才有了IAnalyzeService
﹔
1 | public interface IAnalyzeService |
可以看出筆者只定義了Server收到封包後的解析邏輯以及Client收到封包後的解析邏輯,筆者於各自的BaseServer及BaseClient的OnReceive中呼叫IAnalyzeService中對應的Method﹔
1 | //BaseServer |
1 | //BaseClient |
意即最上層Client使用端只要注入對應的實作IAnalyzeService
,只要OnReceive
事件觸發,底層元件會呼叫其對應的解析封包方法。
結論
藉由這邊來解釋一下底層元件與最上層Client使用端是如何連結的。