2012-05-02 19 views
1

我计划在游戏服务器项目中使用事件,并且我想知道什么是最好的设计。由于我找不到任何适合我的问题的例子,我在这里问。多个服务器中的事件和共享课程

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

现在我想添加一个事件,也就是说,如果一个客户端连接的所有客户端得到通知。而不是迭代所有连接的客户端,就像我以前那样,连接的客户端必须订阅从连接客户端触发的事件处理程序。

我们终于等到我的问题,我的标准设计,在哪里我把回调?通常,我必须在客户端类中创建一个新的方法,如OnClientConnects或其他类,以用于该事件。但是我的服务器正在使用相同的客户端类,并且将它们两个的事件处理程序放在那里似乎很脏。我不能把它放在其他地方,因为该方法需要来自subcscriped客户端的信息,例如套接字。

这使我心中唯一的其他的解决办法是单独的客户端类,或者它,而派生类,对于不同的服务器。虽然这有点棘手,但所有网络代码都在共享类中,因为我必须在那里获得自定义的客户端类,但它应该可能会有一些重载的方法。我想这就是我所能做的。

这一切都感觉有点错的,我想知道,如果这真的是一个可接受的设计,或者如果有一个更好的选择。

回答

0

这是一个有点棘手得到清晰的照片上没有白板一大堆的问题,但如果它的任何帮助......

通常我会是客户端和服务器之间共享的网络库。还有某种ApplicationFramework类,它可能包含客户端和服务器共有的东西,包括配置读取,各种子系统的初始化(日志记录,线程等)。然后,是的,我有一个派生为客户端和各种服务器类型(可能与各种服务器的中间类,因为经常有功能是通用的服务器,但与客户端分开)。

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

+0

感谢您的回答。连接事件只是一个例子。当然,这可能在某个时候都可以使用,但最重要的是唯一的事件(可能很多),只有一个服务器正在使用。 – Mars

+0

够公平的。我在想*那些回调只需要进入那个特定的衍生服务器类。 – pamphlet

+0

另一种方法可能是采用更加面向信息的方法。当一个事件发生时,实例化一个消息对象,并通过TCP将消息发送给相关方,消息类型(如果有意义的是有效载荷,则为'int'),然后让接收者通过消息工厂,只为接收者创建一个“实现”版本,这是您的自定义代码的入口点。这是我在大型商业项目中使用的方法。它冒犯了某些人“过于复杂”,但你拥有完全的控制权(包括过度表现)。 – pamphlet

相关问题