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