簡體   English   中英

多台服務器中的事件和共享類

[英]Events and shared classes in multiple servers

我打算在游戲服務器項目中使用事件,但我想知道最好使用哪種設計。 由於找不到適合我問題的良好示例,因此我在這里提出問題。

我習慣的服務器項目結構幾乎是這樣的:我有一個登錄服務器,一個世界/通道服務器和一個共享庫,用於服務器和客戶機類之類的東西,兩者都使用。 例如,此處所有通信代碼。 服務器派生自服務器類。 客戶端類是套接字的包裝器。 傳入的數據被解析,並傳遞到數據包處理程序方法。

現在,我想添加一個事件,例如,如果一個客戶端連接了所有客戶端,則會收到通知。 與其像過去那樣遍歷所有已連接的客戶端,連接的客戶端必須訂閱事件處理程序,該事件處理程序是從連接的客戶端觸發的。

我們終於解決了我的標准設計問題,該在哪里放置回調? 通常,我必須在客戶端類中創建一個新方法,例如OnClientConnects或其他方法,以用於該事件。 但是我的服務器使用的是相同的客戶端類,並且將它們的事件處理程序放到那里似乎很臟。 我不能將其放在其他地方,因為該方法需要來自下級客戶端(例如套接字)的信息。

我想到的唯一其他解決方案是針對不同服務器的單獨的客戶端類,或從中派生的類。 盡管這有點棘手,但是所有類的網絡代碼都在共享類中,因為我必須在其中獲取自定義客戶端類,但是使用重寫方法應該可以以某種方式實現。 我想這就是我所能做的。

但是,所有這些都感覺有點錯誤,我想知道這是否真的是可以接受的設計,或者是否有更好的選擇。

在沒有白板的情況下獲得清晰的圖像會有些棘手,但是如果有幫助的話...

通常,我會在客戶端和服務器之間共享一個網絡庫。 還有某種ApplicationFramework類,可能包含客戶端和服務器通用的內容,包括配置讀取,各種子系統的初始化(日志,線程等)。

然后,是的,我推導客戶端和各種服務器類型(可能是各種服務器的中間類,因為通常存在服務器共有但與客戶端分離的功能)。

為了解決您的特定問題,我認為讓客戶端和服務器都可以使用該回調是很好的。 服務器在客戶端連接時想要執行某些操作是非常合理的。 即使您現在不需要它,我也可以想象您將來會這樣做。 至少,服務器可以將事件記錄到日志文件中。 但是關鍵是回調的處理屬於client / genericServer / loginServer / worldServer派生的應用程序類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM