【发布时间】:2013-10-23 12:14:49
【问题描述】:
我正在开发一款多人在线游戏。我有以下问题:
当用户断开与服务器的连接时,他需要重新连接。在第一个连接处,在注册期间,注册模块会生成一个特殊的 ResponseDispatcher,它保存对连接 Channel 的引用。但是如果用户退出,这个 Channel 就失效了。尽管我可以检测到问题并清理资源,但我必须将注册模块和连接模块的引用存储到游戏模块,以便在用户授权并重新连接时更新 Channel。这在模块之间产生了很多相互依赖,并且很难维护。
我需要的是 Servlet 容器中的 HttpSession 之类的东西,这样我就可以从服务器的所有模块中获取对我的通道和会话资源的引用。
Servlet 中的 HttpSession 是如何实现的?它是一个存储所有 JSESSIONID 的全局 hashmap,容器从中确定返回哪个属性映射?如果它是一个全局 sysmbol 表,它是否会影响性能(即使 hashMap 的时间是 O(1),也可能存在会话修改,因此它可能必须同步)?
PS。也许针对这种情况的一些设计模式建议也可以。
【问题讨论】:
-
我需要的是 Servlet 容器中的 HttpSession 之类的东西...我不确定你是否需要这个。我没看错:你获取了用户信息,当用户稍后登录时,你需要再次获取此信息?如果是这样,为什么不将数据存储在服务器端(在 da 数据库中)?
-
是的,但他/她重新登录(连接中断)。这意味着我不想将他的数据存储在数据库中 - 玩家仍然在线。他的客户端只需要重新建立连接,使用相应的模块执行身份验证过程,并以某种方式连接到正在运行的 JVM 进程(游戏模块),他的数据已经存在。问题是我需要再次将所有模块连接在一起。当玩家有意离开游戏时,会将所有内容存储在数据库中。在这种情况下,我可以负担得起使用额外的资源加载 + 数据库处理。
-
您的应用程序是否在 Servlet 容器中运行?
-
没有。它是我自己的游戏服务器 - Java SE7 + Netty。
标签: java design-patterns servlets hashmap mmo