我必须开发一个使用大量网络请求来完成其任务的客户端/服务器游戏.
客户端和服务器都通过套接字接收多个命令.
为了处理这些命令,我创建了一个NetworkHandler类,该类在单独的线程上侦听新的Input,并允许我发送新的命令.
这些“命令”实际上是异构的,并且由不同的类使用.
(例如,主服务器类使用“客户端准备好”命令,而游戏类使用“客户端想要一张纸牌”).
因此,我创建了一个CommandDispatcher类,该类侦听NetworkHandler(可观察的模式),并将不同的命令分派给正确的接收者. (全部通过接口)
问题在于,每个要注册为“命令接收器”的类都需要调用CommandDispatcher才能将其自身设置为侦听器.
因为有多个类需要此引用,所以我正在考虑将CommandDispatcher转换为可在任何地方访问的单例类.
我知道Singleton和全局类是不好的,并且我隐藏了一个依赖关系,并且很难测试,但是我看到的唯一替代方法是将CommandDispatcher从Main类传递给所有其他类.
您能帮我找到更好的解决方案吗?
谢谢.
编辑:我想澄清一下我的应用是回合制游戏,所以我没有大量的并行请求.
解决方法:
这是一种常见模式,已在许多环境中解决了很多次.
您需要解决的主要问题是发送命令的速度.您必须确保没有命令可以阻塞系统,否则您将获得无法预测的响应时间.为了实现这一点,您必须尽可能少地管理它的到达.
经典的解决方案是让您的网络侦听器对命令执行最少的工作,然后将其移交给队列.从本质上讲,您只应该抓取到达的消息,将其放入队列中,然后再回听.甚至不反序列化它,只需将它扔到队列中即可.
在队列的另一端,可以有一个或多个进程将命令拉出,构造适当的对象并对其执行所需的任何功能.这可能是您的听众应该听的地方.通常,将发生的所有事情是将反序列化的对象发送到另一个适当的队列进行处理,因此您可能会在这些队列的另一端找到一个更合适的点来监听.
网络侦听器和命令处理器通常都可以用线程池实现.
Is using a Observable Singleton Class to handle network calls bad?
坏?否-但是它不能承受高吞吐量.您最好将网络侦听器与命令调度程序解除关联.