我計劃在遊戲服務器項目中使用事件,並且我想知道什麼是最好的設計。由於我找不到任何適合我的問題的例子,我在這裏問。多個服務器中的事件和共享課程
服務器項目結構我習慣幾乎是這樣的:我有一個登錄服務器,一個世界/通道服務器和共享庫,對於像服務器和客戶端類,這是由兩者使用。所有的通信代碼都在這裏。服務器派生自服務器類。客戶端類是一個套接字的包裝。傳入數據被解析並傳遞給數據包處理程序方法。
現在我想添加一個事件,也就是說,如果一個客戶端連接的所有客戶端得到通知。而不是迭代所有連接的客戶端,就像我以前那樣,連接的客戶端必須訂閱從連接客戶端觸發的事件處理程序。
我們終於等到我的問題,我的標準設計,在哪裏我把回調?通常,我必須在客戶端類中創建一個新的方法,如OnClientConnects或其他類,以用於該事件。但是我的服務器正在使用相同的客戶端類,並且將它們兩個的事件處理程序放在那裏似乎很髒。我不能把它放在其他地方,因爲該方法需要來自subcscriped客戶端的信息,例如套接字。
這使我心中唯一的其他的解決辦法是單獨的客戶端類,或者它,而派生類,對於不同的服務器。雖然這有點棘手,但所有網絡代碼都在共享類中,因爲我必須在那裏獲得自定義的客戶端類,但它應該可能會有一些重載的方法。我想這就是我所能做的。
這一切都感覺有點錯的,我想知道,如果這真的是一個可接受的設計,或者如果有一個更好的選擇。
感謝您的回答。連接事件只是一個例子。當然,這可能在某個時候都可以使用,但最重要的是唯一的事件(可能很多),只有一個服務器正在使用。 – Mars
夠公平的。我在想*那些回調只需要進入那個特定的衍生服務器類。 – pamphlet
另一種方法可能是採用更加面向信息的方法。當一個事件發生時,實例化一個消息對象,並通過TCP將消息發送給相關方,消息類型(如果有意義的是有效載荷,則爲'int'),然後讓接收者通過消息工廠,只爲接收者創建一個「實現」版本,這是您的自定義代碼的入口點。這是我在大型商業項目中使用的方法。它冒犯了某些人「過於複雜」,但你擁有完全的控制權(包括過度表現)。 – pamphlet