默认
发表评论 11
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] 请教服务器重启,还原MobileIMSDK的session问题
阅读(47452) | 评论(11 收藏 淘帖1
我把session缓存到redis,然后重启服务器端,并且还原上次的session,但是发的消息客户端收不到
实现方式如下:
1、在redis里面缓存客户端session信息,假设为:cip,cport;
2、重启后按如下方式还原
SocketAddress caddress = new InetSocketAddress(cip, cport);
IoSession session = acceptor.newSession(caddress, sa);
UserProcessor.getInstance().putUser(Long.valueOf(uid), session, uname);


但是这种情况下给客户端发消息,客户端收不到,这样做是否有问题,可有更好的实现方式,谢谢

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

标签:MobileIMSDK
上一篇:[已回复] 求教通过web端推送消息给MobileIMSDK的app下一篇:请教MobileIMSDK即时通讯框架具体的通信协议格式

本帖已收录至以下技术专辑

推荐方案
评论 11
学习了!
引用:JackJiang 发表于 2016-06-21 11:08
按你的思路,现在跟是不是MINA已经没有关系了。你的session共享方式,在局域网的情况下(也就是服务器、 ...

原来如此!
简单来说,一个客户端的通信,只能与它所在的服务器之间进行双向通信。这也是IM这类特殊通信程序的集群难写的地方。
好的,多谢,那我就通过心跳机制来解决这个问题
引用:ghsheng 发表于 2016-06-21 10:53
是这样的思路,mina是否有方法这样做

按你的思路,现在跟是不是MINA已经没有关系了。你的session共享方式,在局域网的情况下(也就是服务器、客户端在全在同一个局域网),可以正常工作,但公网几乎不可能。

公网不可能的原因,有一个名词,你可以去了解一下:“穿墙”或者“打洞”,就是P2P里常提到的那个打洞。关于NAT打洞,这篇文章从技术上做了介绍:http://www.52im.net/thread-50-1-1.html,需要更多资料可以去百度。

我简要介绍下你思路的问题:A客户端与S1服务器通信成功后,S1即使把A的ip+port告诉了另外的S2服务器,S2服务器发给A的数据会直接被A所在网络的路由直接扔掉,A甚至都不知道有数据来过。因为根据NAT原理,如果S2要发送消息给A,则A必须要首先发送消息给S2(无论S2收不收到的,如果S2是处于路由后面的机器,也是同样的道理),S2再向A发送消息时,A所在网络的路由才会认为这是可信数据(这也差不多就是个简单的P2P打洞原理了,虽然S2是公网服务器,但只是打洞少了一些环节而已,原理还是差不多),才会转发给A。大致原理是这样的,但具体请自行查找资料。

引用:JackJiang 发表于 2016-06-21 10:20
你所理解的双机共享,是否是:A客户端原本是连接到S1服务器上,而S2通过这共享的session(实际就是A客户 ...

是这样的思路,mina是否有方法这样做
引用:ghsheng 发表于 2016-06-21 09:58
我的目的是服务重启时候能还原之前的session
另外,实现双机共享session

你所理解的双机共享,是否是:A客户端原本是连接到S1服务器上,而S2通过这共享的session(实际就是A客户端的IP+PORT信息),就可以直接发送消息给A客户端?
我的目的是服务重启时候能还原之前的session
另外,实现双机共享session
用redis的目的是什么?
已经做了心跳,而且客户端是在正常运行的,并且重启的时间在10秒以内,如果这样不行的话,那缓存session貌似有没有意义了
你自已练手的时候应该写过简单的socket程序吧。
MINA里的这个Session,其实是把客户端的ip和端口存起来了而已,就白了它的核心就是ip+port这个东西。你把session缓存,重启后还原,会存在一个问题:再次连接上来的客户端它的ip和端口很可能已经变化了,你再用这旧的ip和端口反向发消息给客户端,肯定是发不过去的。

另外,假设理想情况下客户端的ip和端口不变,其实还存在一个问题,你缓存起来的Ip+端口,可能会因为客户端所在网络的路由器端口老化(因为又经过去一段时间,几十秒?几分钟?都是可能老化的,具体请参见此文:http://www.52im.net/thread-209-1-1.htmlhttp://www.52im.net/thread-50-1-1.html),而导致依然无法通信。

总之,session可以缓存,但一定要即时更新,否则肯定会失效!
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部