2012-05-02 20 views
1

我計劃在遊戲服務器項目中使用事件,並且我想知道什麼是最好的設計。由於我找不到任何適合我的問題的例子,我在這裏問。多個服務器中的事件和共享課程

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

現在我想添加一個事件,也就是說,如果一個客戶端連接的所有客戶端得到通知。而不是迭代所有連接的客戶端,就像我以前那樣,連接的客戶端必須訂閱從連接客戶端觸發的事件處理程序。

我們終於等到我的問題,我的標準設計,在哪裏我把回調?通常,我必須在客戶端類中創建一個新的方法,如OnClientConnects或其他類,以用於該事件。但是我的服務器正在使用相同的客戶端類,並且將它們兩個的事件處理程序放在那裏似乎很髒。我不能把它放在其他地方,因爲該方法需要來自subcscriped客戶端的信息,例如套接字。

這使我心中唯一的其他的解決辦法是單獨的客戶端類,或者它,而派生類,對於不同的服務器。雖然這有點棘手,但所有網絡代碼都在共享類中,因爲我必須在那裏獲得自定義的客戶端類,但它應該可能會有一些重載的方法。我想這就是我所能做的。

這一切都感覺有點錯的,我想知道,如果這真的是一個可接受的設計,或者如果有一個更好的選擇。

回答

0

這是一個有點棘手得到清晰的照片上沒有白板一大堆的問題,但如果它的任何幫助......

通常我會是客戶端和服務器之間共享的網絡庫。還有某種ApplicationFramework類,它可能包含客戶端和服務器共有的東西,包括配置讀取,各種子系統的初始化(日誌記錄,線程等)。然後,是的,我有一個派生爲客戶端和各種服務器類型(可能與各種服務器的中間類,因爲經常有功能是通用的服務器,但與客戶端分開)。

而且到你的具體問題,我認爲這是罰款,有提供給客戶端和服務器的回調。服務器在客戶端連接時想要做某些事情是非常合理的。即使你現在不需要它,我可以想象你將來會如此。至少,服務器可以將事件記錄到日誌文件中。但重點在於回調的處理屬於client/genericServer/loginServer/worldServer派生的應用程序類。

+0

感謝您的回答。連接事件只是一個例子。當然,這可能在某個時候都可以使用,但最重要的是唯一的事件(可能很多),只有一個服務器正在使用。 – Mars

+0

夠公平的。我在想*那些回調只需要進入那個特定的衍生服務器類。 – pamphlet

+0

另一種方法可能是採用更加面向信息的方法。當一個事件發生時,實例化一個消息對象,並通過TCP將消息發送給相關方,消息類型(如果有意義的是有效載荷,則爲'int'),然後讓接收者通過消息工廠,只爲接收者創建一個「實現」版本,這是您的自定義代碼的入口點。這是我在大型商業項目中使用的方法。它冒犯了某些人「過於複雜」,但你擁有完全的控制權(包括過度表現)。 – pamphlet

相關問題