多个服务器中的事件和共享类
本文关键字:共享 事件 服务器 | 更新日期: 2023-09-27 18:33:00
我计划在游戏服务器项目中使用事件,我想知道最好的设计是什么。由于我找不到任何好的例子来说明我的问题,所以我在这里问。
我习惯的服务器项目结构几乎是这样的:我有一个登录服务器、一个世界/通道服务器和一个共享库,用于服务器和客户端类等东西,两者都使用。例如,所有通信代码都在这里。服务器派生自服务器类。客户端类是套接字周围的包装器。传入数据被解析,并传递给数据包处理程序方法。
现在我想添加一个事件,比如说,如果客户端连接所有客户端都会收到通知。连接的客户端必须订阅从连接客户端触发的事件处理程序,而不是像以前那样遍历所有连接的客户端
。我们终于解决了我的标准设计问题,我应该把回调放在哪里?通常,我必须在客户端类中创建一个新方法,例如OnClientConnects或其他方法,以用于事件。但是我的服务器使用相同的客户端类,并且将它们的事件处理程序放在其中似乎很脏。我不能把它放在其他地方,因为该方法需要来自子订阅客户端的信息,比如套接字。
我想到的唯一其他解决方案是针对不同服务器的单独客户端类,或者更确切地说是从中派生的类。虽然这有点棘手,因为所有网络代码都在共享类中,因为我必须在那里获取自定义客户端类,但应该可以使用重写的方法。我想这就是我能做的。
不过,所有这些感觉有点不对劲,我想知道这是否真的是一个可接受的设计,或者是否有更好的选择。
在没有白板一堆问题的情况下获得清晰的图片有点棘手,但如果有任何帮助......
通常,我会有一个在客户端和服务器之间共享的网络库。以及某种Application
或Framework
类,可能包含客户端和服务器共有的内容,包括配置读取、各种子系统的初始化(日志记录、线程等(。
然后,是的,我会为客户端和各种服务器类型派生(可能为各种服务器提供一个中间类,因为通常有服务器通用但与客户端分开的功能(。
为了解决您的具体问题,我认为可以将该回调提供给客户端和服务器。当客户端连接时,服务器想要执行某些操作是相当合理的。即使你现在不需要它,我可以想象你将来会。至少,服务器可以将事件记录到日志文件中。但关键是回调的处理属于客户端/泛型服务器/登录服务器/世界服务器派生的应用程序类。