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

HikoQiu 发布于 2015/08/23 20:39
阅读 1K+
收藏 0

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

场景是这样:

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

谢谢。

加载中
1
HikoQiu
HikoQiu

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

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

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

0
ArrayListt
ArrayListt

你可以用一个Map来存放。


HikoQiu
HikoQiu
回复 @刘禹星 : 是的。客户端定时发心跳包到服务端就可以
ArrayListt
ArrayListt
回复 @HikoQiu : 服务挂了之后的恢复,估计只有客户端重连机制来处理吧
HikoQiu
HikoQiu
回复 @HikoQiu : 不过, 也没有解决Mina服务挂了之后,恢复的问题。
HikoQiu
HikoQiu
回复 @HikoQiu : 让我找到一个方法了,原来不需要我们自己维护,Mina提供了一个方法: acceptor.getManagedSessions(), 这个方法维护了服务端所有的IoSession
HikoQiu
HikoQiu
回复 @刘禹星 : 但感觉这样子有点弄复杂,并且放在Map里面(如果要被其他地方访问,放在静态变量里面,没记错的话,静态变量是存在堆里面,我不确认是否合适),所以就想问问其他人是怎么存iosession以及对应的映射关系。
下一页
返回顶部
顶部