开发者社区> 问答> 正文

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

使用Mina时, 服务端怎么保存IoSession才能在下次继续操作该会话?
场景是这样:
假设有多个客户端链接请求到服务端,这个时候服务端有很多个IoSession。然后,过段时间之后, 服务端想给某个客户端传输一些数据(session.write),该怎样获取到该客户端的session?
谢谢。

展开
收起
kun坤 2020-05-30 15:12:58 883 0
1 条回答
写回答
取消 提交回答
  • 发现一个解决方案了,具体如下:
    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以及对应的映射关系。

    2020-05-30 15:13:04
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载