5
回答
关于MINA的问题
华为云实践训练营,热门技术免费实践!>>>   

服务器端利用MINA收发客户端发来的信息。

 当一个客户端发送登录指令,服务端成功回复之后,服务端用TreeMap<key,client>来保存客户端的信息,并把IoSession保存在client里。这样当回复客户端发来的心跳指令的时候,直接client.getIoSession()获得IoSession来回复。

最近这样出现一个问题,在我查看登陆客户端信息的时候,有时2个,有时好几个重复的现象。

client的信息都是从Map里通过key来获得,理论上是不应该出现重复现象的,但是他出现了。

这个问题有时候会出现,有时候会在服务端运行一段时间后出现,反正不确定。当出现这个问题的时候在向客户端发送指令的时候,就不会成功了,指令也会发送,但是客户端已经不回应了。

最近也是开始学MINA,对于它的机制,还不是很了解。是不是IoSession混乱导致的?望大哥大姐大妈大姨门帮帮小弟。

感激涕零。

举报
bicel
发帖于7年前 5回/576阅
共有5个答案 最后回答: 7年前

你的 key是每个用利登录一次就产生一个的吗,还是每个用户使用固定的如用户ID

如果是前者,那么就需要有timeout时间了,因为mina是nio的,也就是说当客户端没有信息时他是不会激活任何操作的,包括close

通常这个是客户端直接kill线程做成的,没有正常调用close

如果没有什么限制建议一个服务端只允许一个ip有一个连接,如果重复连接,断掉前次连接重新建立新连接。

这样维护连接最好。我现在就是这样做的。

引用来自#3楼“JavaGG”的帖子

你的 key是每个用利登录一次就产生一个的吗,还是每个用户使用固定的如用户ID

如果是前者,那么就需要有timeout时间了,因为mina是nio的,也就是说当客户端没有信息时他是不会激活任何操作的,包括close

通常这个是客户端直接kill线程做成的,没有正常调用close

回复2楼:因为不是一个客户端,所以用Map来保存登录到服务器的客户端会话以及客户端的状态及数量。

回复3楼:是这样子的,客户端登录的时候会发送登录指令,指令中会包含客户端的编码,这个 编码是唯一的,服务端接收到登录指令之后会提取客户端的编码然后以编码为key。有的客户端有重复登录的情况,但是KEY都相同的,现在的value会覆盖以前的value

呀。客户端每三分钟向服务端发送心跳指令。

大哥能方便加下小D的QQ吗:)448667

不胜感激!

引用来自#4楼“DEC_LIU”的帖子

如果没有什么限制建议一个服务端只允许一个ip有一个连接,如果重复连接,断掉前次连接重新建立新连接。

这样维护连接最好。我现在就是这样做的。

 能方便加我下QQ吗?我现在都快被这个问题困扰死了。

448667谢谢!

顶部