使用Mina时, 服务端怎么保存IoSession才能在下次继续操作该会话?

发布于 2021-11-27 02:21:30 字数 189 浏览 750 评论 7

使用Mina时, 服务端怎么保存IoSession才能在下次继续操作该会话?

场景是这样:

假设有多个客户端链接请求到服务端,这个时候服务端有很多个IoSession。然后,过段时间之后, 服务端想给某个客户端传输一些数据(session.write),该怎样获取到该客户端的session?

谢谢。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

狼亦尘 2021-11-30 20:13:30

回复
但感觉这样子有点弄复杂,并且放在Map里面(如果要被其他地方访问,放在静态变量里面,没记错的话,静态变量是存在堆里面,我不确认是否合适),所以就想问问其他人是怎么存iosession以及对应的映射关系。

猫烠⑼条掵仅有一顆心 2021-11-30 20:08:01

回复
让我找到一个方法了,原来不需要我们自己维护,Mina提供了一个方法: acceptor.getManagedSessions(), 这个方法维护了服务端所有的IoSession

醉生梦死 2021-11-30 19:36:49

回复
不过, 也没有解决Mina服务挂了之后,恢复的问题。

南汐寒笙箫 2021-11-30 17:20:50

回复
服务挂了之后的恢复,估计只有客户端重连机制来处理吧

醉生梦死 2021-11-30 16:43:38

回复
是的。客户端定时发心跳包到服务端就可以

清风夜微凉 2021-11-30 16:09:01

你可以用一个Map来存放。

悟红尘 2021-11-28 09:59:14

发现一个解决方案了,具体如下:

1, 正常情况下,使用IoService(NioSocketAcceptor就是实现了这个接口)的getManagedSessions()方法就能获取到当前机器的所有IoSession,可以通过SocketAddress进行查询。因此只需要存储用户id(或者其他用户标识的字符串)与对应的SocketAddress的映射(或者Ip:port),这样下次要给某个用户发消息就能重新获取到该用户的IoSession。

2. 我发现IoService里面有一个newSession的方法, 只需要传进去一个RemoteAddress和一个localAddress就能生成一个IoSession,这样就能解决程序挂了,重启服务之后,恢复之前的IoSession。只需要我们把用户的Ip:port之前先存起来就行,等服务起来之后,通过Ip:port就能恢复。(该方法还没有尝试,今早看到有这个方法,觉得应该是可行的,等之后试试便知)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文