我正在开发一款多人在线游戏。我有以下问题:
当用户断开与服务器的连接时,他需要重新连接。在第一次连接时,在注册期间,注册模块会生成一个特殊的ResponseDispatcher,它保存对连接Channel的引用。但是,如果用户注销,则此频道将变为无效。即使我可以检测到问题并清理资源,我也必须将注册模块和连接模块的引用存储到游戏模块,以便在用户授权并重新连接时更新频道。这会在模块之间产生很多相互依赖性,并且很难维护。
我需要的是像Servlet容器中的HttpSession,这样我就可以从我服务器的所有模块中获取对我的频道和会话资源的引用。
如何在Servlet中实现HttpSession?它是一个存储所有JSESSIONID的全局hashmap,容器从哪个容器确定要返回的属性映射?如果它是一个全局的sysmbol表,它会达到性能(即使hashMap的时间是O(1),可能会有会话修改,所以它可能必须同步)?
PS。也许这个案例的设计模式的一些建议也可以。
答案 0 :(得分:2)
答案 1 :(得分:2)
我建议您尝试Shiro
Shiro可以在servlet容器外部处理Session Management。
您可能希望使用EhCache支持Shiro以提供正确的缓存,并在需要时提供会话持久性(以及负载平衡等等)
答案 2 :(得分:2)
我不确定问题是什么。为什么“必须存储对注册模块和连接模块的引用”?
无论如何,对你的问题有两个明智的解决方案。
1)制作注册模块和连接模块单例。这是否有用完全取决于这些模块提供的功能。
2)创建注册模块和连接模块持久实体,将它们保存到DataStore,完成必要的引用,并在重新连接时检索和重建它们。
我不太清楚为什么滚动你自己的会话实现会是你想要做的事情,当会话超时时会发生什么?
你的设计似乎有些缺陷。如果他的连接断开,玩家不应该“仍然在线”(这是一个矛盾的术语,如果你没有连接到网络,你根本无法在线),无论这是否是故意的(你无法知道)无论是有意还是无意),你不知道玩家是否能够及时重新连接,所以你应该假设最坏的情况。更重要的是,从纯粹的设计方面来说,被游戏杀死,因为你的互联网连接是垃圾,可能不是你想要处理的东西。如果持久数据是如此昂贵的事情,您应该重新检查您的数据存储选项。此外,在服务器脱机时崩溃的情况会发生什么?