使用Mina时, 服务端怎么保存IoSession才能在下次继续操作该会话?
场景是这样:
假设有多个客户端链接请求到服务端,这个时候服务端有很多个IoSession。然后,过段时间之后, 服务端想给某个客户端传输一些数据(session.write),该怎样获取到该客户端的session?
谢谢。
发现一个解决方案了,具体如下:
1, 正常情况下,使用IoService(NioSocketAcceptor就是实现了这个接口)的getManagedSessions()方法就能获取到当前机器的所有IoSession,可以通过SocketAddress进行查询。因此只需要存储用户id(或者其他用户标识的字符串)与对应的SocketAddress的映射(或者Ip:port),这样下次要给某个用户发消息就能重新获取到该用户的IoSession。
2. 我发现IoService里面有一个newSession的方法, 只需要传进去一个RemoteAddress和一个localAddress就能生成一个IoSession,这样就能解决程序挂了,重启服务之后,恢复之前的IoSession。只需要我们把用户的Ip:port之前先存起来就行,等服务起来之后,通过Ip:port就能恢复。(该方法还没有尝试,今早看到有这个方法,觉得应该是可行的,等之后试试便知) ###### 你可以用一个Map来存放。
######回复 @刘禹星 : 是的。客户端定时发心跳包到服务端就可以######回复 @HikoQiu : 服务挂了之后的恢复,估计只有客户端重连机制来处理吧######回复 @HikoQiu : 不过, 也没有解决Mina服务挂了之后,恢复的问题。######回复 @HikoQiu : 让我找到一个方法了,原来不需要我们自己维护,Mina提供了一个方法: acceptor.getManagedSessions(), 这个方法维护了服务端所有的IoSession######回复 @刘禹星 : 但感觉这样子有点弄复杂,并且放在Map里面(如果要被其他地方访问,放在静态变量里面,没记错的话,静态变量是存在堆里面,我不确认是否合适),所以就想问问其他人是怎么存iosession以及对应的映射关系。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。