繁体   English   中英

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

[英]Events and shared classes in multiple servers

我打算在游戏服务器项目中使用事件,但我想知道最好使用哪种设计。 由于找不到适合我问题的良好示例,因此我在这里提出问题。

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

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

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

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

但是,所有这些都感觉有点错误,我想知道这是否真的是可以接受的设计,或者是否有更好的选择。

在没有白板的情况下获得清晰的图像会有些棘手,但是如果有帮助的话...

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

然后,是的,我推导客户端和各种服务器类型(可能是各种服务器的中间类,因为通常存在服务器共有但与客户端分离的功能)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM