Closed xujiaw closed 4 months ago
forcedOffline、settingUserId
方法都是同步调用。
调用方是同步,但是看执行方,也就是对外服是异步的
@Override public void removeUserSession(long userId, Object msg) { this.ifPresent(userId, userSession -> { ChannelFuture channelFuture = userSession.writeAndFlush(msg); channelFuture.addListener((ChannelFutureListener) future -> { // 回调 UserSessions 中移除对应的玩家 this.removeUserSession(userSession); }); }); }
这个是对外服删除会话的代码,会在删除前刷新最后一条消息, 并走了监听成功再开始删
好的,我试下, 现在的问题就是客户端持有的socket与服务端对应的socket不是同一个
那还有没有这样的并发问题, 就是客户端两个socket同时连过来, 那么在第一步代码ExternalCommunicationKit.forcedOffline(userId);删除历史绑定时, 谁也没删除谁, 然后到第二步绑定的时候, 是不是就是看运气谁能绑定上了?
按示例文档提示, 第一行代码是关闭现在已连接用户通道, 再绑定现有的连接, 但是看源码, 第一步是走的异步, 那第一步和第二步如果并发冲突后, 会不会第一步的杀通道, 把自己当前连接干掉