我计划在游戏服务器项目中使用事件,并且我想知道什么是最好的设计。由于我找不到任何适合我的问题的例子,我在这里问。多个服务器中的事件和共享课程
服务器项目结构我习惯几乎是这样的:我有一个登录服务器,一个世界/通道服务器和共享库,对于像服务器和客户端类,这是由两者使用。所有的通信代码都在这里。服务器派生自服务器类。客户端类是一个套接字的包装。传入数据被解析并传递给数据包处理程序方法。
现在我想添加一个事件,也就是说,如果一个客户端连接的所有客户端得到通知。而不是迭代所有连接的客户端,就像我以前那样,连接的客户端必须订阅从连接客户端触发的事件处理程序。
我们终于等到我的问题,我的标准设计,在哪里我把回调?通常,我必须在客户端类中创建一个新的方法,如OnClientConnects或其他类,以用于该事件。但是我的服务器正在使用相同的客户端类,并且将它们两个的事件处理程序放在那里似乎很脏。我不能把它放在其他地方,因为该方法需要来自subcscriped客户端的信息,例如套接字。
这使我心中唯一的其他的解决办法是单独的客户端类,或者它,而派生类,对于不同的服务器。虽然这有点棘手,但所有网络代码都在共享类中,因为我必须在那里获得自定义的客户端类,但它应该可能会有一些重载的方法。我想这就是我所能做的。
这一切都感觉有点错的,我想知道,如果这真的是一个可接受的设计,或者如果有一个更好的选择。
感谢您的回答。连接事件只是一个例子。当然,这可能在某个时候都可以使用,但最重要的是唯一的事件(可能很多),只有一个服务器正在使用。 – Mars
够公平的。我在想*那些回调只需要进入那个特定的衍生服务器类。 – pamphlet
另一种方法可能是采用更加面向信息的方法。当一个事件发生时,实例化一个消息对象,并通过TCP将消息发送给相关方,消息类型(如果有意义的是有效载荷,则为'int'),然后让接收者通过消息工厂,只为接收者创建一个“实现”版本,这是您的自定义代码的入口点。这是我在大型商业项目中使用的方法。它冒犯了某些人“过于复杂”,但你拥有完全的控制权(包括过度表现)。 – pamphlet