From 68b3ebd5c4b224a9c9d5b0a3d7a3590190cc4a5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BF=9C=E6=96=B9=E5=A4=95=E9=98=B3?= Date: Wed, 15 Feb 2023 12:18:41 +0800 Subject: [PATCH] =?UTF-8?q?android=20sdk=E6=9B=B4=E6=96=B0=20=E9=80=82?= =?UTF-8?q?=E9=85=8DtargetSdkVersion=2033?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/BindMessageListener.java | 107 +++++++++++++++--- .../.idea/caches/build_file_checksums.ser | Bin 536 -> 0 bytes .../cim-client-android/.idea/compiler.xml | 6 - .../cim-client-android/.idea/gradle.xml | 20 ---- .../.idea/jarRepositories.xml | 25 ---- .../cim-client-android/.idea/misc.xml | 9 -- .../cim-client-android/.idea/vcs.xml | 6 - 7 files changed, 90 insertions(+), 83 deletions(-) delete mode 100644 cim-use-examples/cim-client-android/.idea/caches/build_file_checksums.ser delete mode 100644 cim-use-examples/cim-client-android/.idea/compiler.xml delete mode 100644 cim-use-examples/cim-client-android/.idea/gradle.xml delete mode 100644 cim-use-examples/cim-client-android/.idea/jarRepositories.xml delete mode 100644 cim-use-examples/cim-client-android/.idea/misc.xml delete mode 100644 cim-use-examples/cim-client-android/.idea/vcs.xml diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/component/message/BindMessageListener.java b/cim-boot-server/src/main/java/com/farsunset/cim/component/message/BindMessageListener.java index 9b6818a..f1b67cd 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/component/message/BindMessageListener.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/component/message/BindMessageListener.java @@ -28,15 +28,17 @@ import com.farsunset.cim.group.SessionGroup; import com.farsunset.cim.model.Message; import com.farsunset.cim.util.JSONUtils; import io.netty.channel.Channel; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelOutboundInvoker; +import org.apache.commons.lang3.ArrayUtils; import org.springframework.context.event.EventListener; import org.springframework.data.redis.connection.MessageListener; import org.springframework.stereotype.Component; import javax.annotation.Resource; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Predicate; /** * 集群环境下,监控多设备登录情况,控制是否其余终端下线的逻辑 @@ -55,6 +57,11 @@ public class BindMessageListener implements MessageListener { */ private final Map conflictMap = new HashMap<>(); + /* + * web可能同一个终端 打开多 tab页面,可以同时保持连接 + */ + private final Set keepLiveChannels = new HashSet<>(); + @Resource private SessionGroup sessionGroup; @@ -64,6 +71,8 @@ public class BindMessageListener implements MessageListener { conflictMap.put(Session.CHANNEL_WINDOWS,new String[]{Session.CHANNEL_WINDOWS,Session.CHANNEL_WEB,Session.CHANNEL_MAC}); conflictMap.put(Session.CHANNEL_WEB,new String[]{Session.CHANNEL_WINDOWS,Session.CHANNEL_WEB,Session.CHANNEL_MAC}); conflictMap.put(Session.CHANNEL_MAC,new String[]{Session.CHANNEL_WINDOWS,Session.CHANNEL_WEB,Session.CHANNEL_MAC}); + + keepLiveChannels.add(Session.CHANNEL_WEB); } @EventListener @@ -79,34 +88,98 @@ public class BindMessageListener implements MessageListener { this.handle(session); } - private void handle(Session session) { + private void handle(Session session){ String uid = session.getUid(); + String[] conflictChannels = conflictMap.get(session.getChannel()); + if (ArrayUtils.isEmpty(conflictChannels)){ + return; + } + Collection channelList = sessionGroup.find(uid,conflictChannels); - channelList.removeIf(channel -> session.getNid().equals(channel.attr(ChannelAttr.ID).get())); + channelList.removeIf(new KeepLivePredicate(session)); /* - * 获取到其他在线的终端连接,提示账号再其他终端登录 + * 同设备仅关闭连接,无需通知客户端 */ - channelList.forEach(channel -> { + channelList.stream().filter(new SameDevicePredicate(session)).forEach(ChannelOutboundInvoker::close); - if (Objects.equals(session.getDeviceId(),channel.attr(ChannelAttr.DEVICE_ID).get())){ - channel.close(); - return; - } + /* + * 不同设备关闭连接, 通知客户端账号在其他设备登录 + */ + channelList.stream().filter(new DifferentDevicePredicate(session)).forEach(new BreakOffMessageConsumer(uid,session.getDeviceName())); - Message message = new Message(); + } + + + private static class BreakOffMessageConsumer implements Consumer { + + private final Message message; + + private BreakOffMessageConsumer(String uid,String deviceName) { + message = new Message(); message.setAction(FORCE_OFFLINE_ACTION); message.setReceiver(uid); message.setSender(SYSTEM_ID); - message.setContent(session.getDeviceName()); - channel.writeAndFlush(message); - channel.close(); - }); + message.setContent(deviceName); + } + + @Override + public void accept(Channel channel) { + channel.writeAndFlush(message).addListener(ChannelFutureListener.CLOSE); + } + } + private static class SameDevicePredicate implements Predicate { + + private final String deviceId; + + private SameDevicePredicate(Session session) { + this.deviceId = session.getDeviceId(); + } + + @Override + public boolean test(Channel channel) { + return Objects.equals(this.deviceId,channel.attr(ChannelAttr.DEVICE_ID).get()); + } + } + + private static class DifferentDevicePredicate implements Predicate{ + + private final SameDevicePredicate predicate; + + private DifferentDevicePredicate(Session session) { + this.predicate = new SameDevicePredicate(session); + } + + @Override + public boolean test(Channel channel) { + return !predicate.test(channel); + } + } + private class KeepLivePredicate implements Predicate{ + private final Session session; + + private KeepLivePredicate(Session session) { + this.session = session; + } + + @Override + public boolean test(Channel ioChannel) { + + if (Objects.equals(session.getNid(),ioChannel.attr(ChannelAttr.ID).get())){ + return true; + } + + String deviceId = ioChannel.attr(ChannelAttr.DEVICE_ID).toString(); + + String channel = ioChannel.attr(ChannelAttr.CHANNEL).toString(); + + return keepLiveChannels.contains(channel) && Objects.equals(session.getDeviceId(),deviceId); + } } } diff --git a/cim-use-examples/cim-client-android/.idea/caches/build_file_checksums.ser b/cim-use-examples/cim-client-android/.idea/caches/build_file_checksums.ser deleted file mode 100644 index b6115fd534fc3010c4d62c5453e62ab1e4fa990b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 536 zcmZ4UmVvdnh`~NNKUXg?FQq6yGexf?KR>5fFEb@IQ7^qHF(oHeub?PDD>b=9F91S2 zm1gFoxMk*~I%lLNXBU^|7Q2L-Ts|(GuF1r}nf0c10SK&86jm-X(8bAKG^i=LzL#j}Kg zCkffv*}V&1C3VeyC!0bEgSvibacWVqennMYiW=Kf@-LmkpdV z-u!T?D`61Cqq>UwT=9a`ulu>!4_&GcX8a9wUSdIkK6bxMezjkpx2p7;?19}jvSA9I F6#(@cx@-Ud diff --git a/cim-use-examples/cim-client-android/.idea/compiler.xml b/cim-use-examples/cim-client-android/.idea/compiler.xml deleted file mode 100644 index 61a9130..0000000 --- a/cim-use-examples/cim-client-android/.idea/compiler.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/cim-use-examples/cim-client-android/.idea/gradle.xml b/cim-use-examples/cim-client-android/.idea/gradle.xml deleted file mode 100644 index 066c787..0000000 --- a/cim-use-examples/cim-client-android/.idea/gradle.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/cim-use-examples/cim-client-android/.idea/jarRepositories.xml b/cim-use-examples/cim-client-android/.idea/jarRepositories.xml deleted file mode 100644 index a5f05cd..0000000 --- a/cim-use-examples/cim-client-android/.idea/jarRepositories.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/cim-use-examples/cim-client-android/.idea/misc.xml b/cim-use-examples/cim-client-android/.idea/misc.xml deleted file mode 100644 index d5d35ec..0000000 --- a/cim-use-examples/cim-client-android/.idea/misc.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/cim-use-examples/cim-client-android/.idea/vcs.xml b/cim-use-examples/cim-client-android/.idea/vcs.xml deleted file mode 100644 index b2bdec2..0000000 --- a/cim-use-examples/cim-client-android/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file