1

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

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

现在我想添加一个事件,例如,如果客户端连接所有客户端都会收到通知。不像我以前那样遍历所有连接的客户端,连接的客户端必须订阅一个事件处理程序,该处理程序是从连接的客户端触发的。

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

我想到的唯一其他解决方案是针对不同服务器的单独的客户端类,或者更确切地说是从它派生的类。虽然这有点棘手,所有网络代码都在共享类中,因为我必须在其中获取自定义客户端类,但应该可以通过重写方法以某种方式实现。我想这就是我能做的。

不过,这一切感觉有点不对劲,我想知道这是否真的是一个可以接受的设计,或者是否有更好的选择。

4

1 回答 1

0

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

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

然后,是的,我会对客户端和各种服务器类型进行派生(可能具有用于各种服务器的中间类,因为通常存在服务器共有但与客户端分开的功能)。

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

于 2012-05-02T15:28:54.597 回答