多个服务器中的事件和共享类

时间:2012-05-02 15:12:47

标签: c# events architecture

我计划在游戏服务器项目中使用事件,我想知道什么是最好的设计。由于我找不到任何问题的好例子,我在这里问。

我习惯的服务器项目结构就是这样的:我有一个登录服务器,一个世界/频道服务器和一个共享库,用于服务器和客户端类,两者都使用它们。例如,所有通信代码都在这里。服务器派生自服务器类。客户端类是套接字的包装器。传入数据被解析,并传递给数据包处理程序方法。

现在我想添加一个事件,比如说,如果客户端连接所有客户端都会得到通知。与以往不同,迭代所有连接的客户端,连接的客户端必须订阅事件处理程序,这是从连接客户端触发的。

我们终于解决了我的标准设计问题,我在哪里放回调?通常,我必须在客户端类中创建一个新方法,如OnClientConnects或其他东西,用于事件。但是我的服务器使用的是同一个客户端类,并且在那里放置事件处理程序似乎很脏。我不能把它放在别处,因为该方法需要来自subcscriped客户端的信息,如socket。

我想到的唯一其他解决方案是单独的客户端类,或者更确切地说是来自它的派生类,用于不同的服务器。虽然这有点棘手,但是共享类中包含所有网络代码,因为我必须在那里获得自定义客户端类,但是应该可以使用重写方法。我想这就是我所能做的一切。

所有这些都有点不对劲,我想知道这是否真的是一个可接受的设计,或者是否有更好的选择。

1 个答案:

答案 0 :(得分:0)

在没有白板问题的情况下获得清晰的图片有点棘手,但是如果它有任何帮助......

通常我会有一个在客户端和服务器之间共享的网络库。还有某种ApplicationFramework类,可能包含客户端和服务器共有的东西,包括配置读取,各种子系统的初始化(日志记录,线程等)。

然后,是的,我推导出客户端和各种服务器类型(可能带有各种服务器的中间类,因为服务器通常有一些共同的功能,但它们与客户机)。

为了解决您的具体问题,我认为将回调提供给客户端和服务器都没关系。服务器在客户端连接时想要做某事是非常合理的。即使你现在不需要它,我可以想象你将来会这样做。至少,服务器可以将事件记录到日志文件中。但重点是回调的处理属于client / genericServer / loginServer / worldServer派生的应用程序类。