我计划在游戏服务器项目中使用事件,我想知道最好的设计是什么。由于我找不到任何适合我的问题的好例子,所以我在这里问。
我习惯的服务器项目结构几乎是这样的:我有一个登录服务器、一个世界/频道服务器和一个共享库,用于服务器和客户端类之类的东西,它们都被两者使用。例如,所有通信代码都在这里。服务器派生自服务器类。客户端类是套接字的包装器。解析传入的数据,并将其传递给数据包处理程序方法。
现在我想添加一个事件,例如,如果客户端连接所有客户端都会收到通知。不像我以前那样遍历所有连接的客户端,连接的客户端必须订阅一个事件处理程序,该处理程序是从连接的客户端触发的。
我们终于解决了我的标准设计问题,我在哪里放置回调?通常我必须在客户端类中创建一个新方法,如 OnClientConnects 或其他东西,以用于事件。但是我的服务器使用相同的客户端类,并且将它们的事件处理程序放在那里似乎很脏。我不能把它放在其他地方,因为该方法需要来自订阅客户端的信息,比如套接字。
我想到的唯一其他解决方案是针对不同服务器的单独的客户端类,或者更确切地说是从它派生的类。虽然这有点棘手,所有网络代码都在共享类中,因为我必须在其中获取自定义客户端类,但应该可以通过重写方法以某种方式实现。我想这就是我能做的。
不过,这一切感觉有点不对劲,我想知道这是否真的是一个可以接受的设计,或者是否有更好的选择。