From 756ff96b8a235d0bc25c63b94829f30b7ef4dfc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BF=9C=E6=96=B9=E5=A4=95=E9=98=B3?= Date: Sun, 9 May 2021 10:41:44 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8D=87=E7=BA=A7=E5=88=B04.?= =?UTF-8?q?0.0=20=E5=8F=82=E8=A7=81=E6=9B=B4=E6=96=B0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3.8.0.VERSION => 4.0.0.VERSION | 0 README.md | 36 +- cim-boot-server/cim-boot-server.iml | 149 +- cim-boot-server/cim-boot-server.ipr | 1013 ++++++-- cim-boot-server/cim-boot-server.iws | 383 ++- .../cim-java-sdk => cim-boot-server}/jar.bat | 0 .../cim-java-sdk => cim-boot-server}/jar.sh | 0 .../libs/cim-server-sdk-mina-3.8.0.jar | Bin 98744 -> 0 bytes .../libs/cim-server-sdk-netty-3.8.0.jar | Bin 98278 -> 0 bytes .../libs/cim-server-sdk-netty-4.0.0.jar | Bin 0 -> 79166 bytes cim-boot-server/pom.xml | 43 +- cim-boot-server/run.bat | 1 + cim-boot-server/run.sh | 3 + .../com/farsunset/cim/BootApplication.java | 25 +- .../com/farsunset/cim/ServerLauncher.java | 42 - .../cim/component/handler/BindHandler.java | 95 + .../handler/ClosedHandler.java} | 51 +- .../handler/annotation/CIMHandler.java | 17 +- .../message/BindMessageListener.java | 78 + .../message/PushMessageListener.java | 32 + .../push/CIMMessagePusher.java | 4 +- .../push/DefaultMessagePusher.java} | 54 +- .../redis/KeyValueRedisTemplate.java | 52 +- .../component/redis/SignalRedisTemplate.java | 55 + .../com/farsunset/cim/config/CIMConfig.java | 47 +- .../com/farsunset/cim/config/RedisConfig.java | 62 + .../farsunset/cim/config/SwaggerConfig.java | 56 + .../farsunset/cim/constants/Constants.java | 17 +- .../com/farsunset/cim/entity/Session.java | 240 ++ .../farsunset/cim/handler/BindHandler.java | 141 -- .../admin}/NavigationController.java | 2 +- .../controller/admin}/SessionController.java | 12 +- .../mvc/controller/api/APNsController.java | 69 + .../mvc/controller/api/MessageController.java | 83 + .../cim/push/DefaultMessagePusher.java | 96 - .../cim/repository/SessionRepository.java | 65 +- .../{ApnsService.java => APNsService.java} | 2 +- ...essionService.java => SessionService.java} | 29 +- ...sServiceImpl.java => APNsServiceImpl.java} | 64 +- .../service/impl/CIMSessionServiceImpl.java | 76 - .../cim/service/impl/SessionServiceImpl.java | 89 + .../com/farsunset/cim/util/JSONUtils.java | 78 + .../src/main/resources/apns/app.p12 | Bin 0 -> 3220 bytes .../src/main/resources/application.properties | 46 +- .../main/resources/i18n/messages.properties | 2 +- .../src/main/resources/logback-spring.xml | 12 + .../src/main/resources/page/console/nav.html | 7 +- .../page/console/session/manage.html | 33 +- .../page/console/webclient/index.html | 50 +- .../resources/static/js/cim/cim.web.sdk.js | 48 +- .../android/cim-android-sdk-4.0.0.jar | Bin 75504 -> 75368 bytes .../java/cim-java-sdk-3.8.0.jar | Bin 83466 -> 0 bytes cim-client-sdk-libs/js/cim.web.sdk.js | 48 +- cim-client-sdk/cim-android-sdk/pom.xml | 2 +- .../cim/sdk/android/CIMCacheManager.java | 3 +- .../cim/sdk/android/CIMConnectorManager.java | 16 +- .../android/CIMEventBroadcastReceiver.java | 1 - .../cim/sdk/android/CIMEventListener.java | 1 + .../cim/sdk/android/CIMListenerManager.java | 54 +- .../cim/sdk/android/CIMPushManager.java | 51 +- .../android/coder/ClientMessageDecoder.java | 2 +- .../cim/sdk/android/constant/CIMConstant.java | 8 +- .../cim/sdk/android/logger/CIMLogger.java | 13 +- .../cim/sdk/android/model/Message.java | 22 +- .../farsunset/cim/sdk/android/model/Ping.java | 17 +- .../farsunset/cim/sdk/android/model/Pong.java | 8 +- .../cim/sdk/android/model/ReplyBody.java | 6 +- .../cim/sdk/android/model/SentBody.java | 6 +- .../xcschemes/xcschememanagement.plist | 24 + .../UserInterfaceState.xcuserstate | Bin 0 -> 19381 bytes .../CIMKit/Handler/CIMSendMessageData.m | 24 +- cim-client-sdk/cim-java-sdk/cim-java-sdk.iml | 15 - cim-client-sdk/cim-java-sdk/pom.xml | 51 - .../cim/sdk/client/CIMCacheManager.java | 80 - .../cim/sdk/client/CIMConnectorManager.java | 294 --- .../sdk/client/CIMEventBroadcastReceiver.java | 155 -- .../cim/sdk/client/CIMEventListener.java | 77 - .../cim/sdk/client/CIMListenerManager.java | 114 - .../cim/sdk/client/CIMPushManager.java | 259 -- .../cim/sdk/client/CIMPushService.java | 77 - .../cim/sdk/client/coder/CIMLogger.java | 114 - .../client/coder/ClientMessageDecoder.java | 118 - .../client/coder/ClientMessageEncoder.java | 64 - .../cim/sdk/client/constant/CIMConstant.java | 104 - .../sdk/client/model/HeartbeatRequest.java | 63 - .../sdk/client/model/HeartbeatResponse.java | 62 - .../cim/sdk/client/model/Message.java | 176 -- .../cim/sdk/client/model/ReplyBody.java | 134 - .../cim/sdk/client/model/SentBody.java | 118 - .../cim/sdk/model/proto/Message.proto | 15 - .../cim/sdk/model/proto/MessageProto.java | 1643 ------------ .../cim/sdk/model/proto/ReplyBody.proto | 13 - .../cim/sdk/model/proto/ReplyBodyProto.java | 1304 ---------- .../cim/sdk/model/proto/SentBody.proto | 11 - .../cim/sdk/model/proto/SentBodyProto.java | 1007 -------- .../.gitignore | 0 cim-server-sdk/cim-server-sdk-mina/.gitignore | 2 - .../cim-server-sdk-mina.iml | 2 - cim-server-sdk/cim-server-sdk-mina/pom.xml | 55 - .../server/coder/AppMessageCodecFactory.java | 53 - .../sdk/server/coder/AppMessageDecoder.java | 95 - .../sdk/server/coder/AppMessageEncoder.java | 65 - .../server/coder/WebMessageCodecFactory.java | 53 - .../sdk/server/coder/WebMessageDecoder.java | 204 -- .../sdk/server/coder/WebMessageEncoder.java | 112 - .../cim/sdk/server/constant/CIMConstant.java | 57 - .../server/handler/CIMNioSocketAcceptor.java | 274 -- .../sdk/server/handler/WebsocketHandler.java | 51 - .../cim/sdk/server/model/CIMSession.java | 427 ---- .../sdk/server/model/HandshakerResponse.java | 63 - .../sdk/server/model/HeartbeatRequest.java | 63 - .../sdk/server/model/HeartbeatResponse.java | 47 - .../cim/sdk/server/model/Message.java | 205 -- .../cim/sdk/server/model/ReplyBody.java | 161 -- .../cim/sdk/server/model/SentBody.java | 106 - .../cim/sdk/server/model/proto/Session.proto | 20 - .../sdk/server/model/proto/SessionProto.java | 2218 ----------------- .../cim-server-sdk-netty.iml | 16 +- .../cim-server-sdk-netty/.gitignore | 2 - cim-server-sdk/cim-server-sdk-netty/jar.bat | 1 - cim-server-sdk/cim-server-sdk-netty/jar.sh | 1 - .../sdk/server/coder/WebMessageDecoder.java | 90 - .../cim/sdk/server/model/CIMSession.java | 437 ---- .../cim/sdk/server/model/proto/Message.proto | 15 - .../sdk/server/model/proto/MessageProto.java | 1643 ------------ .../sdk/server/model/proto/ReplyBody.proto | 13 - .../server/model/proto/ReplyBodyProto.java | 1304 ---------- .../cim/sdk/server/model/proto/SentBody.proto | 10 - .../sdk/server/model/proto/SentBodyProto.java | 1008 -------- .../cim/sdk/server/model/proto/Session.proto | 20 - .../sdk/server/model/proto/SessionProto.java | 2218 ----------------- .../{cim-server-sdk-mina => }/jar.bat | 0 .../{cim-server-sdk-mina => }/jar.sh | 0 .../{cim-server-sdk-netty => }/pom.xml | 16 +- .../sdk/server/coder/AppMessageDecoder.java | 15 +- .../sdk/server/coder/AppMessageEncoder.java | 0 .../sdk/server/coder/WebMessageDecoder.java | 44 + .../sdk/server/coder/WebMessageEncoder.java | 9 +- .../cim/sdk/server/constant/CIMConstant.java | 29 +- .../cim/sdk/server/constant/ChannelAttr.java | 12 + .../cim/sdk/server/group/SessionGroup.java | 80 + .../cim/sdk/server/group/TagSessionGroup.java | 13 + .../server/handler/CIMNioSocketAcceptor.java | 226 +- .../sdk/server/handler/CIMRequestHandler.java | 5 +- .../sdk/server/handler/LoggingHandler.java} | 41 +- .../cim/sdk/server/model/Message.java | 2 +- .../farsunset/cim/sdk/server/model/Ping.java} | 18 +- .../farsunset/cim/sdk/server/model/Pong.java} | 12 +- .../cim/sdk/server/model/ReplyBody.java | 13 +- .../cim/sdk/server/model/SentBody.java | 23 +- .../cim/sdk/server/model/Transportable.java | 0 .../cim/sdk/server/model/proto/Message.proto | 0 .../sdk/server/model/proto/MessageProto.java | 0 .../sdk/server/model/proto/ReplyBody.proto | 0 .../server/model/proto/ReplyBodyProto.java | 0 .../cim/sdk/server/model/proto/SentBody.proto | 0 .../sdk/server/model/proto/SentBodyProto.java | 0 .../cim-client-android/.gitignore | 11 +- .../.idea/caches/build_file_checksums.ser | Bin 536 -> 536 bytes .../.idea/caches/gradle_models.ser | Bin 132621 -> 0 bytes .../cim-client-android/.idea/compiler.xml | 6 + .../cim-client-android/.idea/encodings.xml | 4 - .../cim-client-android/.idea/gradle.xml | 3 +- .../.idea/jarRepositories.xml | 25 + .../cim-client-android/.idea/misc.xml | 7 +- .../cim-client-android/.idea/modules.xml | 6 +- .../.idea/runConfigurations.xml | 12 - .../cim-client-android/.idea/vcs.xml | 8 - .../cim-client-android/app/.gitignore | 2 +- .../cim-client-android/app/build.gradle | 50 +- .../app/libs/cim-android-sdk-4.0.0.jar | Bin 75504 -> 75368 bytes .../cim-client-android/app/proguard-rules.pro | 73 +- .../app/src/main/AndroidManifest.xml | 53 +- .../farsunset/cim/activity/LoginActivity.java | 152 ++ .../cim/activity/MessageActivity.java | 122 + .../cim/adapter/MessageListAdapter.java | 77 + .../adapter/holder/MessageViewHolder.java} | 29 +- .../com/farsunset/cim/app/CIMApplication.java | 129 + .../farsunset/cim/data/LoginDataSource.java | 29 + .../farsunset/cim/data/LoginRepository.java | 54 + .../java/com/farsunset/cim/data/Result.java | 48 + .../cim/data/model/LoggedInUser.java | 23 + .../cim/dialog/SendMessageDialog.java | 88 + .../farsunset/cim/http/MessageService.java | 17 + .../cim/http/SendMessageManager.java | 79 + .../cim/reveiver/CIMPushMessageReceiver.java | 92 + .../farsunset/cim/widget/ColorBallView.java | 149 ++ .../cim/widget/MeteorWallpaperView.java | 147 ++ .../farsunset/cim/widget/RainbowBallView.java | 151 ++ .../adapter/SystemMsgListViewAdapter.java | 100 - .../ichat/example/app/CIMMonitorActivity.java | 97 - .../farsunset/ichat/example/app/Constant.java | 36 - .../receiver/CIMPushManagerReceiver.java | 98 - .../ichat/example/ui/LoginActivity.java | 112 - .../ichat/example/ui/SplashActivity.java | 82 - .../example/ui/SystemMessageActivity.java | 128 - .../res/color/login_text_button_selector.xml | 6 - .../app/src/main/res/drawable-hdpi/icon.png | Bin 6338 -> 0 bytes .../src/main/res/drawable-hdpi/login_bg.jpg | Bin 18446 -> 0 bytes .../drawable-hdpi/login_default_avatar.png | Bin 11585 -> 0 bytes .../main/res/drawable-hdpi/login_input.9.png | Bin 414 -> 0 bytes .../skin_common_btn_blue_bg_pressed.9.png | Bin 883 -> 0 bytes .../skin_common_btn_blue_unpressed.9.png | Bin 878 -> 0 bytes .../drawable-hdpi/skin_header_bar_bg.9.png | Bin 479 -> 0 bytes .../skin_header_btn_back_normal.9.png | Bin 2011 -> 0 bytes .../skin_header_btn_back_press.9.png | Bin 2107 -> 0 bytes .../drawable-hdpi/skin_msgbox_bg_nor.9.png | Bin 232 -> 0 bytes .../skin_msgbox_bg_pressed.9.png | Bin 530 -> 0 bytes .../drawable-hdpi/skin_msgbox_bg_top.9.png | Bin 238 -> 0 bytes .../src/main/res/drawable-hdpi/splash_bg.jpg | Bin 52564 -> 0 bytes .../drawable-v24/ic_launcher_foreground.xml | 30 + .../main/res/drawable/app_login_bg_compat.xml | 7 + .../main/res/drawable/common_button_blue.xml | 6 - .../main/res/drawable/common_msgbox_bg.xml | 5 - .../res/drawable/dialog_edit_background.xml | 9 + .../drawable/dialog_material_background.xml | 7 + .../res/drawable/edit_background_corners.xml | 6 + .../res/drawable/ic_launcher_background.xml | 170 ++ .../src/main/res/drawable/icon_menu_send.xml | 21 + .../res/drawable/login_content_background.xml | 5 + .../res/drawable/top_back_left_selector.xml | 5 - .../src/main/res/layout/activity_login.xml | 205 +- .../src/main/res/layout/activity_message.xml | 24 + .../src/main/res/layout/activity_splansh.xml | 7 - .../main/res/layout/activity_system_chat.xml | 30 - .../main/res/layout/dialog_send_message.xml | 85 + .../src/main/res/layout/item_chat_sysmsg.xml | 74 - .../app/src/main/res/layout/item_message.xml | 33 + .../res/layout/layout_global_top_header.xml | 47 - .../app/src/main/res/menu/send.xml | 9 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3593 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5339 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2636 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3388 bytes .../mipmap-xhdpi/app_splash_background.jpg | Bin 0 -> 193671 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4926 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7472 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7909 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11873 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10652 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 16570 bytes .../app/src/main/res/values/colors.xml | 5 +- .../app/src/main/res/values/dimens.xml | 5 + .../app/src/main/res/values/strings.xml | 14 +- .../app/src/main/res/values/styles.xml | 10 - .../app/src/main/res/values/themes.xml | 17 + .../main/res/xml/network_security_config.xml | 4 + .../cim-client-android/build.gradle | 9 +- .../cim-client-android/gradle.properties | 12 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- cim-use-examples/cim-client-android/gradlew | 0 .../cim-client-android/gradlew.bat | 168 +- .../cim-client-android/settings.gradle | 1 + cim-use-examples/cim-client-java/.gitignore | 2 - .../cim-client-java/cim-client-java.iml | 2 - .../cim-client-java/cim-java-client.iml | 24 - .../libs/cim-java-sdk-3.8.0.jar | Bin 83466 -> 0 bytes cim-use-examples/cim-client-java/pom.xml | 59 - .../src/main/java/CIMJavaClient.java | 101 - .../cim-client-vue}/Auto.vue | 0 .../cim-client-vue}/websocket/cim.web.sdk.js | 33 +- .../cim-client-vue}/websocket/message.js | 0 .../cim-client-vue}/websocket/replybody.js | 0 .../cim-client-vue}/websocket/sentbody.js | 0 cim-use-examples/cim-client-web/index.html | 70 +- .../cim-client-web/js/cim/cim.web.sdk.js | 48 +- doc/AndroidSDK使用文档.doc | Bin 87040 -> 0 bytes doc/CimKit iOS教程.pdf | Bin 555084 -> 0 bytes doc/IOS或PC客户端等SDK开发文档.doc | Bin 44078 -> 0 bytes doc/JavaSDK使用文档.doc | Bin 36864 -> 0 bytes doc/WebSDK使用文档.doc | Bin 27136 -> 0 bytes doc/proto/c#.zip | Bin 0 -> 8523 bytes doc/proto/c++.zip | Bin 0 -> 26578 bytes doc/proto/objective-c.zip | Bin 0 -> 11304 bytes doc/proto/other.zip | Bin 0 -> 2275 bytes doc/proto/python.zip | Bin 0 -> 5780 bytes doc/发送消息接口文档.doc | Bin 25088 -> 0 bytes doc/在线文档.txt | 1 + 278 files changed, 5485 insertions(+), 19796 deletions(-) rename 3.8.0.VERSION => 4.0.0.VERSION (100%) rename {cim-client-sdk/cim-java-sdk => cim-boot-server}/jar.bat (100%) mode change 100755 => 100644 rename {cim-client-sdk/cim-java-sdk => cim-boot-server}/jar.sh (100%) delete mode 100644 cim-boot-server/libs/cim-server-sdk-mina-3.8.0.jar delete mode 100644 cim-boot-server/libs/cim-server-sdk-netty-3.8.0.jar create mode 100644 cim-boot-server/libs/cim-server-sdk-netty-4.0.0.jar create mode 100644 cim-boot-server/run.bat create mode 100755 cim-boot-server/run.sh rename cim-server-sdk/cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/model/Transportable.java => cim-boot-server/src/main/java/com/farsunset/cim/BootApplication.java (77%) delete mode 100644 cim-boot-server/src/main/java/com/farsunset/cim/ServerLauncher.java create mode 100644 cim-boot-server/src/main/java/com/farsunset/cim/component/handler/BindHandler.java rename cim-boot-server/src/main/java/com/farsunset/cim/{handler/SessionClosedHandler.java => component/handler/ClosedHandler.java} (57%) rename cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/model/Protobufable.java => cim-boot-server/src/main/java/com/farsunset/cim/component/handler/annotation/CIMHandler.java (79%) create mode 100644 cim-boot-server/src/main/java/com/farsunset/cim/component/message/BindMessageListener.java create mode 100644 cim-boot-server/src/main/java/com/farsunset/cim/component/message/PushMessageListener.java rename cim-boot-server/src/main/java/com/farsunset/cim/{ => component}/push/CIMMessagePusher.java (94%) rename cim-boot-server/src/main/java/com/farsunset/cim/{api/controller/MessageController.java => component/push/DefaultMessagePusher.java} (51%) rename cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/model/Intent.java => cim-boot-server/src/main/java/com/farsunset/cim/component/redis/KeyValueRedisTemplate.java (52%) create mode 100644 cim-boot-server/src/main/java/com/farsunset/cim/component/redis/SignalRedisTemplate.java create mode 100644 cim-boot-server/src/main/java/com/farsunset/cim/config/RedisConfig.java create mode 100644 cim-boot-server/src/main/java/com/farsunset/cim/config/SwaggerConfig.java rename cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/handler/CIMRequestHandler.java => cim-boot-server/src/main/java/com/farsunset/cim/constants/Constants.java (75%) create mode 100644 cim-boot-server/src/main/java/com/farsunset/cim/entity/Session.java delete mode 100644 cim-boot-server/src/main/java/com/farsunset/cim/handler/BindHandler.java rename cim-boot-server/src/main/java/com/farsunset/cim/{admin/controller => mvc/controller/admin}/NavigationController.java (97%) rename cim-boot-server/src/main/java/com/farsunset/cim/{admin/controller => mvc/controller/admin}/SessionController.java (87%) create mode 100644 cim-boot-server/src/main/java/com/farsunset/cim/mvc/controller/api/APNsController.java create mode 100644 cim-boot-server/src/main/java/com/farsunset/cim/mvc/controller/api/MessageController.java delete mode 100644 cim-boot-server/src/main/java/com/farsunset/cim/push/DefaultMessagePusher.java rename cim-boot-server/src/main/java/com/farsunset/cim/service/{ApnsService.java => APNsService.java} (97%) rename cim-boot-server/src/main/java/com/farsunset/cim/service/{CIMSessionService.java => SessionService.java} (69%) rename cim-boot-server/src/main/java/com/farsunset/cim/service/impl/{JavaApnsServiceImpl.java => APNsServiceImpl.java} (55%) delete mode 100644 cim-boot-server/src/main/java/com/farsunset/cim/service/impl/CIMSessionServiceImpl.java create mode 100644 cim-boot-server/src/main/java/com/farsunset/cim/service/impl/SessionServiceImpl.java create mode 100644 cim-boot-server/src/main/java/com/farsunset/cim/util/JSONUtils.java create mode 100644 cim-boot-server/src/main/resources/apns/app.p12 create mode 100644 cim-boot-server/src/main/resources/logback-spring.xml rename cim-use-examples/cim-client-android/app/libs/cim-android-sdk-3.8.2.jar => cim-client-sdk-libs/android/cim-android-sdk-4.0.0.jar (57%) delete mode 100644 cim-client-sdk-libs/java/cim-java-sdk-3.8.0.jar create mode 100644 cim-client-sdk/cim-ios-sdk/CIMKit.xcodeproj/xcuserdata/xiajun.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 cim-client-sdk/cim-ios-sdk/CIMKit.xcworkspace/xcuserdata/xiajun.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100755 cim-client-sdk/cim-java-sdk/cim-java-sdk.iml delete mode 100755 cim-client-sdk/cim-java-sdk/pom.xml delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/CIMCacheManager.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/CIMConnectorManager.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/CIMEventBroadcastReceiver.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/CIMEventListener.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/CIMListenerManager.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/CIMPushManager.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/CIMPushService.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/coder/CIMLogger.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/coder/ClientMessageDecoder.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/coder/ClientMessageEncoder.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/constant/CIMConstant.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/model/HeartbeatRequest.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/model/HeartbeatResponse.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/model/Message.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/model/ReplyBody.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/model/SentBody.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/model/proto/Message.proto delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/model/proto/MessageProto.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/model/proto/ReplyBody.proto delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/model/proto/ReplyBodyProto.java delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/model/proto/SentBody.proto delete mode 100644 cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/model/proto/SentBodyProto.java rename {cim-client-sdk/cim-java-sdk => cim-server-sdk}/.gitignore (100%) delete mode 100644 cim-server-sdk/cim-server-sdk-mina/.gitignore delete mode 100644 cim-server-sdk/cim-server-sdk-mina/cim-server-sdk-mina.iml delete mode 100644 cim-server-sdk/cim-server-sdk-mina/pom.xml delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/coder/AppMessageCodecFactory.java delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/coder/AppMessageDecoder.java delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/coder/AppMessageEncoder.java delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/coder/WebMessageCodecFactory.java delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/coder/WebMessageDecoder.java delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/coder/WebMessageEncoder.java delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/constant/CIMConstant.java delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/handler/CIMNioSocketAcceptor.java delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/handler/WebsocketHandler.java delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/model/CIMSession.java delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/model/HandshakerResponse.java delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/model/HeartbeatRequest.java delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/model/HeartbeatResponse.java delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/model/Message.java delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/model/ReplyBody.java delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/model/SentBody.java delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/model/proto/Session.proto delete mode 100644 cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/model/proto/SessionProto.java rename cim-server-sdk/{cim-server-sdk-netty => }/cim-server-sdk-netty.iml (71%) delete mode 100644 cim-server-sdk/cim-server-sdk-netty/.gitignore delete mode 100644 cim-server-sdk/cim-server-sdk-netty/jar.bat delete mode 100644 cim-server-sdk/cim-server-sdk-netty/jar.sh delete mode 100644 cim-server-sdk/cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/coder/WebMessageDecoder.java delete mode 100644 cim-server-sdk/cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/model/CIMSession.java delete mode 100644 cim-server-sdk/cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/model/proto/Message.proto delete mode 100644 cim-server-sdk/cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/model/proto/MessageProto.java delete mode 100644 cim-server-sdk/cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/model/proto/ReplyBody.proto delete mode 100644 cim-server-sdk/cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/model/proto/ReplyBodyProto.java delete mode 100644 cim-server-sdk/cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/model/proto/SentBody.proto delete mode 100644 cim-server-sdk/cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/model/proto/SentBodyProto.java delete mode 100644 cim-server-sdk/cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/model/proto/Session.proto delete mode 100644 cim-server-sdk/cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/model/proto/SessionProto.java rename cim-server-sdk/{cim-server-sdk-mina => }/jar.bat (100%) rename cim-server-sdk/{cim-server-sdk-mina => }/jar.sh (100%) mode change 100644 => 100755 rename cim-server-sdk/{cim-server-sdk-netty => }/pom.xml (83%) rename cim-server-sdk/{cim-server-sdk-netty => }/src/main/java/com/farsunset/cim/sdk/server/coder/AppMessageDecoder.java (89%) rename cim-server-sdk/{cim-server-sdk-netty => }/src/main/java/com/farsunset/cim/sdk/server/coder/AppMessageEncoder.java (100%) create mode 100644 cim-server-sdk/src/main/java/com/farsunset/cim/sdk/server/coder/WebMessageDecoder.java rename cim-server-sdk/{cim-server-sdk-netty => }/src/main/java/com/farsunset/cim/sdk/server/coder/WebMessageEncoder.java (84%) rename cim-server-sdk/{cim-server-sdk-netty => }/src/main/java/com/farsunset/cim/sdk/server/constant/CIMConstant.java (75%) create mode 100644 cim-server-sdk/src/main/java/com/farsunset/cim/sdk/server/constant/ChannelAttr.java create mode 100644 cim-server-sdk/src/main/java/com/farsunset/cim/sdk/server/group/SessionGroup.java create mode 100644 cim-server-sdk/src/main/java/com/farsunset/cim/sdk/server/group/TagSessionGroup.java rename cim-server-sdk/{cim-server-sdk-netty => }/src/main/java/com/farsunset/cim/sdk/server/handler/CIMNioSocketAcceptor.java (61%) rename cim-server-sdk/{cim-server-sdk-netty => }/src/main/java/com/farsunset/cim/sdk/server/handler/CIMRequestHandler.java (92%) rename cim-server-sdk/{cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/handler/HeartbeatHandler.java => src/main/java/com/farsunset/cim/sdk/server/handler/LoggingHandler.java} (54%) rename cim-server-sdk/{cim-server-sdk-netty => }/src/main/java/com/farsunset/cim/sdk/server/model/Message.java (99%) rename cim-server-sdk/{cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/model/HeartbeatRequest.java => src/main/java/com/farsunset/cim/sdk/server/model/Ping.java} (76%) rename cim-server-sdk/{cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/model/HeartbeatResponse.java => src/main/java/com/farsunset/cim/sdk/server/model/Pong.java} (81%) rename cim-server-sdk/{cim-server-sdk-netty => }/src/main/java/com/farsunset/cim/sdk/server/model/ReplyBody.java (91%) rename cim-server-sdk/{cim-server-sdk-netty => }/src/main/java/com/farsunset/cim/sdk/server/model/SentBody.java (80%) rename cim-server-sdk/{cim-server-sdk-mina => }/src/main/java/com/farsunset/cim/sdk/server/model/Transportable.java (100%) rename cim-server-sdk/{cim-server-sdk-mina => }/src/main/java/com/farsunset/cim/sdk/server/model/proto/Message.proto (100%) rename cim-server-sdk/{cim-server-sdk-mina => }/src/main/java/com/farsunset/cim/sdk/server/model/proto/MessageProto.java (100%) rename cim-server-sdk/{cim-server-sdk-mina => }/src/main/java/com/farsunset/cim/sdk/server/model/proto/ReplyBody.proto (100%) rename cim-server-sdk/{cim-server-sdk-mina => }/src/main/java/com/farsunset/cim/sdk/server/model/proto/ReplyBodyProto.java (100%) rename cim-server-sdk/{cim-server-sdk-mina => }/src/main/java/com/farsunset/cim/sdk/server/model/proto/SentBody.proto (100%) rename cim-server-sdk/{cim-server-sdk-mina => }/src/main/java/com/farsunset/cim/sdk/server/model/proto/SentBodyProto.java (100%) delete mode 100644 cim-use-examples/cim-client-android/.idea/caches/gradle_models.ser create mode 100644 cim-use-examples/cim-client-android/.idea/compiler.xml delete mode 100644 cim-use-examples/cim-client-android/.idea/encodings.xml create mode 100644 cim-use-examples/cim-client-android/.idea/jarRepositories.xml delete mode 100644 cim-use-examples/cim-client-android/.idea/runConfigurations.xml delete mode 100644 cim-use-examples/cim-client-android/.idea/vcs.xml rename cim-client-sdk-libs/android/cim-android-sdk-3.8.2.jar => cim-use-examples/cim-client-android/app/libs/cim-android-sdk-4.0.0.jar (57%) create mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/activity/LoginActivity.java create mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/activity/MessageActivity.java create mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/adapter/MessageListAdapter.java rename cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/{ichat/example/adapter/MessageTimeDescComparator.java => cim/adapter/holder/MessageViewHolder.java} (58%) create mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/app/CIMApplication.java create mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/data/LoginDataSource.java create mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/data/LoginRepository.java create mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/data/Result.java create mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/data/model/LoggedInUser.java create mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/dialog/SendMessageDialog.java create mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/http/MessageService.java create mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/http/SendMessageManager.java create mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/reveiver/CIMPushMessageReceiver.java create mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/widget/ColorBallView.java create mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/widget/MeteorWallpaperView.java create mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/widget/RainbowBallView.java delete mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/ichat/example/adapter/SystemMsgListViewAdapter.java delete mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/ichat/example/app/CIMMonitorActivity.java delete mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/ichat/example/app/Constant.java delete mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/ichat/example/receiver/CIMPushManagerReceiver.java delete mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/ichat/example/ui/LoginActivity.java delete mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/ichat/example/ui/SplashActivity.java delete mode 100644 cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/ichat/example/ui/SystemMessageActivity.java delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/color/login_text_button_selector.xml delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable-hdpi/icon.png delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable-hdpi/login_bg.jpg delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable-hdpi/login_default_avatar.png delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable-hdpi/login_input.9.png delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable-hdpi/skin_common_btn_blue_bg_pressed.9.png delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable-hdpi/skin_common_btn_blue_unpressed.9.png delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable-hdpi/skin_header_bar_bg.9.png delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable-hdpi/skin_header_btn_back_normal.9.png delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable-hdpi/skin_header_btn_back_press.9.png delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable-hdpi/skin_msgbox_bg_nor.9.png delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable-hdpi/skin_msgbox_bg_pressed.9.png delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable-hdpi/skin_msgbox_bg_top.9.png delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable-hdpi/splash_bg.jpg create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable/app_login_bg_compat.xml delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable/common_button_blue.xml delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable/common_msgbox_bg.xml create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable/dialog_edit_background.xml create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable/dialog_material_background.xml create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable/edit_background_corners.xml create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable/icon_menu_send.xml create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable/login_content_background.xml delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/drawable/top_back_left_selector.xml create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/layout/activity_message.xml delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/layout/activity_splansh.xml delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/layout/activity_system_chat.xml create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/layout/dialog_send_message.xml delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/layout/item_chat_sysmsg.xml create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/layout/item_message.xml delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/layout/layout_global_top_header.xml create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/menu/send.xml create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/mipmap-xhdpi/app_splash_background.jpg create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/values/dimens.xml delete mode 100644 cim-use-examples/cim-client-android/app/src/main/res/values/styles.xml create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/values/themes.xml create mode 100644 cim-use-examples/cim-client-android/app/src/main/res/xml/network_security_config.xml mode change 100644 => 100755 cim-use-examples/cim-client-android/gradlew delete mode 100644 cim-use-examples/cim-client-java/.gitignore delete mode 100644 cim-use-examples/cim-client-java/cim-client-java.iml delete mode 100644 cim-use-examples/cim-client-java/cim-java-client.iml delete mode 100644 cim-use-examples/cim-client-java/libs/cim-java-sdk-3.8.0.jar delete mode 100644 cim-use-examples/cim-client-java/pom.xml delete mode 100644 cim-use-examples/cim-client-java/src/main/java/CIMJavaClient.java rename {cim-client-vue => cim-use-examples/cim-client-vue}/Auto.vue (100%) rename {cim-client-vue => cim-use-examples/cim-client-vue}/websocket/cim.web.sdk.js (84%) rename {cim-client-vue => cim-use-examples/cim-client-vue}/websocket/message.js (100%) rename {cim-client-vue => cim-use-examples/cim-client-vue}/websocket/replybody.js (100%) rename {cim-client-vue => cim-use-examples/cim-client-vue}/websocket/sentbody.js (100%) delete mode 100644 doc/AndroidSDK使用文档.doc delete mode 100644 doc/CimKit iOS教程.pdf delete mode 100644 doc/IOS或PC客户端等SDK开发文档.doc delete mode 100644 doc/JavaSDK使用文档.doc delete mode 100644 doc/WebSDK使用文档.doc create mode 100644 doc/proto/c#.zip create mode 100644 doc/proto/c++.zip create mode 100644 doc/proto/objective-c.zip create mode 100644 doc/proto/other.zip create mode 100644 doc/proto/python.zip delete mode 100644 doc/发送消息接口文档.doc create mode 100644 doc/在线文档.txt diff --git a/3.8.0.VERSION b/4.0.0.VERSION similarity index 100% rename from 3.8.0.VERSION rename to 4.0.0.VERSION diff --git a/README.md b/README.md index 808e213..b8c2a31 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ #### 项目介绍 -CIM项目是基于mina或者netty框架下的推送系统,我们平常使用第三方的推送SDK,如极光推送,百度推送,小米推送,以及腾讯信鸽等来支撑自己的移动端的业务,或许有一些用户自己实现即时通讯系统的需求,那么CIM为您提供了一个解决方案或者思路,目前CIM支持 websocket,android,ios,桌面应用,系统应用等多端接入支持,目前CIM服务端使用springboot搭建仅仅拥有消息推送的功能,关于数据缓存与持久化都需要使用者自己开发,但是配备了比较完整的使用文档。最后希望CIM能为您带来一些价值。 +CIM是一套完善的消息推送框架,可应用于信令推送,即时聊天,移动设备指令推送等领域。开发者可沉浸于业务开发,不用关心消息通道链接,消息编解码协议等繁杂处理。 +CIM采用业内主流开源技术构建,易于扩展和使用,并完美支持集群部署支持海量链接,目前支持websocket,android,ios,桌面应用,系统应用等多端接入持,可应用于移动应用,物联网,智能家居,嵌入式开发,桌面应用,WEB应用即时消服务。 +用时7年 基于CIM的项目已经运行在全国各个地方,包括上司公司,各地政务系统,警务系统等服务于上百家客户,希望CIM也能为您带来价值,如果您也希望加入项目成为贡献者,请联系我。 +#### 在线文档 +## [https://www.yuque.com/yuanfangxiyang/ma4ytb](https://www.yuque.com/yuanfangxiyang/ma4ytb) --- ## 以下是基于CIM开发的2款产品,并不开源!!! @@ -20,18 +24,6 @@ CIM项目是基于mina或者netty框架下的推送系统,我们平常使用 --- -#### 目录说明 - -1.cim-use-examples是各个客户端使用示例 - -2.cim-client-sdk 是各个客户端的SDK源码 - -3.cim-server-sdk 是服务端SDK源码,分为 mina和netty 两个版本,二者任选其一 - -4.cim-boot-server是springboot服务端工程源码,使用Idea工具开发 - -其中所有的sdk均为IntelliJ IDEA工程,Maven打包成jar导出引入到对应的客户端或服务端工程 - #### 功能预览 @@ -94,4 +86,22 @@ CIM项目是基于mina或者netty框架下的推送系统,我们平常使用 4.所有sdk均使用maven构建,idea工具开发,发现多处代码单词拼写错误,使用阿里语法检测组件优化了部分代码 5.同步修改了文档 + + +------------------------------------------------------------------------------------------- +版本:4.0.0/时间:2021-04-30 + +1.websocket支持心跳机制 + +2.删除mina版本服务端sdk 、删除java版本客户端sdk + +3.cim-boot-server重写、加入了推送集群实现。cim-android-client重写演示了更丰富的功能 + +4.客户端上行数据参数名修改 + account > uid + device > deviceName + CR > PONG + +5.文档放到语雀在线文档 +6.其他30多处多处代码优化 diff --git a/cim-boot-server/cim-boot-server.iml b/cim-boot-server/cim-boot-server.iml index 3112c78..08af5f8 100644 --- a/cim-boot-server/cim-boot-server.iml +++ b/cim-boot-server/cim-boot-server.iml @@ -13,6 +13,16 @@ + + + + + + + + + + @@ -25,63 +35,114 @@ - - - - - + + + + + - - + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + - + - + - - - - - - - - - + + + + + + + + + diff --git a/cim-boot-server/cim-boot-server.ipr b/cim-boot-server/cim-boot-server.ipr index ade6802..ba48396 100644 --- a/cim-boot-server/cim-boot-server.ipr +++ b/cim-boot-server/cim-boot-server.ipr @@ -69,6 +69,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -94,7 +215,21 @@ + + + + + + + + + + + + + + @@ -128,70 +263,70 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -216,6 +351,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -227,81 +395,301 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -315,15 +703,59 @@ - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -337,92 +769,158 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -436,6 +934,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -458,213 +989,367 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cim-boot-server/cim-boot-server.iws b/cim-boot-server/cim-boot-server.iws index 6c1a6ca..35bf051 100644 --- a/cim-boot-server/cim-boot-server.iws +++ b/cim-boot-server/cim-boot-server.iws @@ -3,8 +3,235 @@ + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + - + + + + @@ -62,17 +327,18 @@ - - + + @@ -104,99 +370,16 @@ + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -212,9 +395,9 @@ diff --git a/cim-client-sdk/cim-java-sdk/jar.bat b/cim-boot-server/jar.bat old mode 100755 new mode 100644 similarity index 100% rename from cim-client-sdk/cim-java-sdk/jar.bat rename to cim-boot-server/jar.bat diff --git a/cim-client-sdk/cim-java-sdk/jar.sh b/cim-boot-server/jar.sh similarity index 100% rename from cim-client-sdk/cim-java-sdk/jar.sh rename to cim-boot-server/jar.sh diff --git a/cim-boot-server/libs/cim-server-sdk-mina-3.8.0.jar b/cim-boot-server/libs/cim-server-sdk-mina-3.8.0.jar deleted file mode 100644 index fc0334421ddd20a603b2b12bf59530453c07eded..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98744 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ΝY@z7EmRfsyp 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 diff --git a/cim-boot-server/libs/cim-server-sdk-netty-3.8.0.jar b/cim-boot-server/libs/cim-server-sdk-netty-3.8.0.jar deleted file mode 100644 index 5da5b91dc0d75016fde8a78d796746b3fc64bf06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98278 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 diff --git a/cim-boot-server/libs/cim-server-sdk-netty-4.0.0.jar b/cim-boot-server/libs/cim-server-sdk-netty-4.0.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..aa1ccc7c577a3245c410495b7ad99467bae1fcf4 GIT binary patch literal 79166 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

Q7l@cZrR$nDWh=`OJh}4ebt3U&iHOA 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 KD< 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 literal 0 HcmV?d00001 diff --git a/cim-boot-server/pom.xml b/cim-boot-server/pom.xml index 785683c..0684879 100644 --- a/cim-boot-server/pom.xml +++ b/cim-boot-server/pom.xml @@ -11,15 +11,17 @@ org.springframework.boot spring-boot-starter-parent - 2.2.5.RELEASE + 2.4.4 1.8 - 4.1.35.Final - 2.1.3 + 4.1.62.Final 3.11.1 + 8.0.22 + 2.8.0 + 3.0.0 @@ -36,26 +38,40 @@ spring-boot-starter-freemarker + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + io.springfox + springfox-boot-starter + ${swagger.version} + com.farsunset cim-server-sdk - 3.8.0 + 4.0.0 system - ${project.basedir}/libs/cim-server-sdk-netty-3.8.0.jar + ${project.basedir}/libs/cim-server-sdk-netty-4.0.0.jar - - - - org.apache.mina - mina-core - ${mina.version} + org.apache.commons + commons-pool2 + ${common.pool.version} - + + mysql + mysql-connector-java + ${mysql.jdbc.version} + - io.netty netty-handler @@ -113,7 +129,6 @@ commons-lang3 3.8.1 - diff --git a/cim-boot-server/run.bat b/cim-boot-server/run.bat new file mode 100644 index 0000000..826a9da --- /dev/null +++ b/cim-boot-server/run.bat @@ -0,0 +1 @@ +java -Dcom.sun.akuma.Daemon=daemonized -Dspring.profiles.active=pro -jar ./cim-boot-server-4.0.0.jar \ No newline at end of file diff --git a/cim-boot-server/run.sh b/cim-boot-server/run.sh new file mode 100755 index 0000000..9c0e3ce --- /dev/null +++ b/cim-boot-server/run.sh @@ -0,0 +1,3 @@ +#! /bin/bash + +java -Dcom.sun.akuma.Daemon=daemonized -Dspring.profiles.active=pro -jar ./cim-boot-server-4.0.0.jar & \ No newline at end of file diff --git a/cim-server-sdk/cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/model/Transportable.java b/cim-boot-server/src/main/java/com/farsunset/cim/BootApplication.java similarity index 77% rename from cim-server-sdk/cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/model/Transportable.java rename to cim-boot-server/src/main/java/com/farsunset/cim/BootApplication.java index ef165f8..6c2dc67 100644 --- a/cim-server-sdk/cim-server-sdk-netty/src/main/java/com/farsunset/cim/sdk/server/model/Transportable.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/BootApplication.java @@ -19,21 +19,14 @@ * * *************************************************************************************** */ -package com.farsunset.cim.sdk.server.model; +package com.farsunset.cim; -/** - * 需要向另一端发送的结构体 - */ -public interface Transportable { - /** - * 消息体字节数组 - * @return - */ - byte[] getBody(); +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; - /** - * 消息类型 - * @return - */ - byte getType(); -} +@SpringBootApplication +public class BootApplication { + public static void main(String[] args) { + SpringApplication.run(BootApplication.class, args); + } +} \ No newline at end of file diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/ServerLauncher.java b/cim-boot-server/src/main/java/com/farsunset/cim/ServerLauncher.java deleted file mode 100644 index 01de5f9..0000000 --- a/cim-boot-server/src/main/java/com/farsunset/cim/ServerLauncher.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2013-2019 Xia Jun(3979434@qq.com). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *************************************************************************************** - * * - * Website : http://www.farsunset.com * - * * - *************************************************************************************** - */ -package com.farsunset.cim; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration; -import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration; -import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration; -import org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration; -import org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration; -import org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration; -import org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration; - -@SpringBootApplication -public class ServerLauncher { - public static void main(String[] args) { - SpringApplication.run(ServerLauncher.class, args); - } -} \ No newline at end of file diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/BindHandler.java b/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/BindHandler.java new file mode 100644 index 0000000..bbfd8f6 --- /dev/null +++ b/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/BindHandler.java @@ -0,0 +1,95 @@ +/* + * Copyright 2013-2019 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.component.handler; + +import com.farsunset.cim.component.handler.annotation.CIMHandler; +import com.farsunset.cim.component.redis.SignalRedisTemplate; +import com.farsunset.cim.entity.Session; +import com.farsunset.cim.sdk.server.constant.ChannelAttr; +import com.farsunset.cim.sdk.server.group.SessionGroup; +import com.farsunset.cim.sdk.server.handler.CIMRequestHandler; +import com.farsunset.cim.sdk.server.model.ReplyBody; +import com.farsunset.cim.sdk.server.model.SentBody; +import com.farsunset.cim.service.SessionService; +import io.netty.channel.Channel; +import org.springframework.http.HttpStatus; + +import javax.annotation.Resource; + +/** + * 客户长连接 账户绑定实现 + */ +@CIMHandler(key = "client_bind") +public class BindHandler implements CIMRequestHandler { + + @Resource + private SessionService sessionService; + + @Resource + private SessionGroup sessionGroup; + + @Resource + private SignalRedisTemplate signalRedisTemplate; + + @Override + public void process(Channel channel, SentBody body) { + + ReplyBody reply = new ReplyBody(); + reply.setKey(body.getKey()); + reply.setCode(HttpStatus.OK.value()); + reply.setTimestamp(System.currentTimeMillis()); + + String uid = body.get("uid"); + Session session = new Session(); + session.setUid(uid); + session.setNid(channel.attr(ChannelAttr.ID).get()); + session.setDeviceId(body.get("deviceId")); + session.setChannel(body.get("channel")); + session.setDeviceName(body.get("deviceName")); + session.setAppVersion(body.get("appVersion")); + session.setOsVersion(body.get("osVersion")); + + channel.attr(ChannelAttr.UID).set(uid); + channel.attr(ChannelAttr.CHANNEL).set(session.getChannel()); + channel.attr(ChannelAttr.DEVICE_ID).set(session.getDeviceId()); + + /* + *存储到数据库 + */ + sessionService.add(session); + + /* + * 添加到内存管理 + */ + sessionGroup.add(channel); + + /* + *向客户端发送bind响应 + */ + channel.writeAndFlush(reply); + + /* + * 发送上线事件到集群中的其他实例,控制其他设备下线 + */ + signalRedisTemplate.bind(session); + } +} diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/handler/SessionClosedHandler.java b/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/ClosedHandler.java similarity index 57% rename from cim-boot-server/src/main/java/com/farsunset/cim/handler/SessionClosedHandler.java rename to cim-boot-server/src/main/java/com/farsunset/cim/component/handler/ClosedHandler.java index 253002c..8485b64 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/handler/SessionClosedHandler.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/ClosedHandler.java @@ -19,44 +19,47 @@ * * *************************************************************************************** */ -package com.farsunset.cim.handler; +package com.farsunset.cim.component.handler; - -import com.farsunset.cim.sdk.server.constant.CIMConstant; +import com.farsunset.cim.component.handler.annotation.CIMHandler; +import com.farsunset.cim.entity.Session; +import com.farsunset.cim.sdk.server.constant.ChannelAttr; +import com.farsunset.cim.sdk.server.group.SessionGroup; import com.farsunset.cim.sdk.server.handler.CIMRequestHandler; -import com.farsunset.cim.sdk.server.model.CIMSession; import com.farsunset.cim.sdk.server.model.SentBody; -import com.farsunset.cim.service.CIMSessionService; -import org.springframework.stereotype.Component; +import com.farsunset.cim.service.SessionService; +import io.netty.channel.Channel; import javax.annotation.Resource; import java.util.Objects; - -/* - * 断开连接,清除session - * +/** + * 连接断开时,更新用户相关状态 */ - -@Component -public class SessionClosedHandler implements CIMRequestHandler { +@CIMHandler(key = "client_closed") +public class ClosedHandler implements CIMRequestHandler { @Resource - private CIMSessionService cimSessionService; - + private SessionService sessionService; + + @Resource + private SessionGroup sessionGroup; + @Override - public void process(CIMSession ios, SentBody message) { - Object quietly = ios.getAttribute(CIMConstant.KEY_QUIETLY_CLOSE); - if (Objects.equals(quietly, true)) { + public void process(Channel channel, SentBody message) { + + String uid = channel.attr(ChannelAttr.UID).get(); + + String nid = channel.attr(ChannelAttr.ID).get(); + + sessionGroup.remove(channel); + + if (!Objects.equals(channel.attr(ChannelAttr.CHANNEL).get(), Session.CHANNEL_IOS)){ + sessionService.delete(uid,nid); return; } - Object account = ios.getAttribute(CIMConstant.KEY_ACCOUNT); - if (account == null) { - return; - } - - cimSessionService.remove(account.toString()); + sessionService.updateState(uid,nid, Session.STATE_INACTIVE); } } diff --git a/cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/model/Protobufable.java b/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/annotation/CIMHandler.java similarity index 79% rename from cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/model/Protobufable.java rename to cim-boot-server/src/main/java/com/farsunset/cim/component/handler/annotation/CIMHandler.java index ebac655..e4227fc 100644 --- a/cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/model/Protobufable.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/annotation/CIMHandler.java @@ -19,14 +19,17 @@ * * *************************************************************************************** */ -package com.farsunset.cim.sdk.client.model; +package com.farsunset.cim.component.handler.annotation; -/** - * 需要向另一端发送的结构体 - */ -public interface Protobufable { +import org.springframework.stereotype.Component; - byte[] getByteArray(); +import java.lang.annotation.*; - byte getType(); +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Component + +public @interface CIMHandler { + String key(); } 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 new file mode 100644 index 0000000..3a46b35 --- /dev/null +++ b/cim-boot-server/src/main/java/com/farsunset/cim/component/message/BindMessageListener.java @@ -0,0 +1,78 @@ +package com.farsunset.cim.component.message; + +import com.farsunset.cim.entity.Session; +import com.farsunset.cim.sdk.server.constant.ChannelAttr; +import com.farsunset.cim.sdk.server.group.SessionGroup; +import com.farsunset.cim.sdk.server.model.Message; +import com.farsunset.cim.util.JSONUtils; +import io.netty.channel.Channel; +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; + +/** + * 集群环境下,监控多设备登录情况,控制是否其余终端下线的逻辑 + */ +@Component +public class BindMessageListener implements MessageListener { + + private static final String FORCE_OFFLINE_ACTION = "999"; + + private static final String SYSTEM_ID = "0"; + + /* + 一个账号只能在同一个类型的终端登录 + 如: 多个android或ios不能同时在线 + 一个android或ios可以和web,桌面同时在线 + */ + private final Map conflictMap = new HashMap<>(); + + @Resource + private SessionGroup sessionGroup; + + public BindMessageListener(){ + conflictMap.put(Session.CHANNEL_ANDROID,new String[]{Session.CHANNEL_ANDROID,Session.CHANNEL_IOS}); + conflictMap.put(Session.CHANNEL_IOS,new String[]{Session.CHANNEL_ANDROID,Session.CHANNEL_IOS}); + 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}); + } + + @Override + public void onMessage(org.springframework.data.redis.connection.Message redisMessage, byte[] bytes) { + + Session session = JSONUtils.fromJson(redisMessage.getBody(), Session.class); + String uid = session.getUid(); + String[] conflictChannels = conflictMap.get(session.getChannel()); + + Collection channelList = sessionGroup.find(uid,conflictChannels); + + channelList.removeIf(channel -> session.getNid().equals(channel.attr(ChannelAttr.ID).get())); + + /* + * 获取到其他在线的终端连接,提示账号再其他终端登录 + */ + channelList.forEach(channel -> { + + if (Objects.equals(session.getDeviceId(),channel.attr(ChannelAttr.DEVICE_ID).get())){ + channel.close(); + return; + } + + Message message = new Message(); + message.setAction(FORCE_OFFLINE_ACTION); + message.setReceiver(uid); + message.setSender(SYSTEM_ID); + message.setContent(session.getDeviceName()); + channel.writeAndFlush(message); + channel.close(); + }); + + + } +} diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/component/message/PushMessageListener.java b/cim-boot-server/src/main/java/com/farsunset/cim/component/message/PushMessageListener.java new file mode 100644 index 0000000..45bb817 --- /dev/null +++ b/cim-boot-server/src/main/java/com/farsunset/cim/component/message/PushMessageListener.java @@ -0,0 +1,32 @@ +package com.farsunset.cim.component.message; + +import com.farsunset.cim.sdk.server.group.SessionGroup; +import com.farsunset.cim.sdk.server.model.Message; +import com.farsunset.cim.util.JSONUtils; +import org.springframework.data.redis.connection.MessageListener; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + + +/** + * 集群环境下,监听redis队列,广播消息到每个实例进行推送 + * 如果使用MQ的情况也,最好替换为MQ消息队列 + */ +@Component +public class PushMessageListener implements MessageListener { + + @Resource + private SessionGroup sessionGroup; + + @Override + public void onMessage(org.springframework.data.redis.connection.Message redisMessage, byte[] bytes) { + + Message message = JSONUtils.fromJson(redisMessage.getBody(), Message.class); + + String uid = message.getReceiver(); + + sessionGroup.write(uid,message); + + } +} diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/push/CIMMessagePusher.java b/cim-boot-server/src/main/java/com/farsunset/cim/component/push/CIMMessagePusher.java similarity index 94% rename from cim-boot-server/src/main/java/com/farsunset/cim/push/CIMMessagePusher.java rename to cim-boot-server/src/main/java/com/farsunset/cim/component/push/CIMMessagePusher.java index 6741c03..d401f35 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/push/CIMMessagePusher.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/component/push/CIMMessagePusher.java @@ -19,7 +19,7 @@ * * *************************************************************************************** */ -package com.farsunset.cim.push; +package com.farsunset.cim.component.push; import com.farsunset.cim.sdk.server.model.Message; @@ -34,6 +34,6 @@ public interface CIMMessagePusher { * * @param msg */ - public void push(Message msg); + void push(Message msg); } diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/api/controller/MessageController.java b/cim-boot-server/src/main/java/com/farsunset/cim/component/push/DefaultMessagePusher.java similarity index 51% rename from cim-boot-server/src/main/java/com/farsunset/cim/api/controller/MessageController.java rename to cim-boot-server/src/main/java/com/farsunset/cim/component/push/DefaultMessagePusher.java index d0ec491..1af7d6d 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/api/controller/MessageController.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/component/push/DefaultMessagePusher.java @@ -19,34 +19,56 @@ * * *************************************************************************************** */ -package com.farsunset.cim.api.controller; +package com.farsunset.cim.component.push; -import com.farsunset.cim.push.DefaultMessagePusher; +import com.farsunset.cim.component.redis.KeyValueRedisTemplate; +import com.farsunset.cim.component.redis.SignalRedisTemplate; import com.farsunset.cim.sdk.server.model.Message; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import com.farsunset.cim.service.APNsService; +import org.springframework.stereotype.Component; import javax.annotation.Resource; - -@RestController -@RequestMapping("/api/message") -public class MessageController { +/* + * 消息发送实现类 + * + */ +@Component +public class DefaultMessagePusher implements CIMMessagePusher { @Resource - private DefaultMessagePusher defaultMessagePusher; + private APNsService apnsService; + @Resource + private SignalRedisTemplate signalRedisTemplate; - @PostMapping(value = "/send") - public ResponseEntity send(Message message) { + @Resource + private KeyValueRedisTemplate keyValueRedisTemplate; - message.setId(System.currentTimeMillis()); + /** + * 向用户发送消息 + * + * @param message + */ + public final void push(Message message) { - defaultMessagePusher.push(message); + String uid = message.getReceiver(); + + /* + * 说明iOS客户端开启了apns + */ + String deviceToken = keyValueRedisTemplate.getDeviceToken(uid); + if(deviceToken != null) { + apnsService.push(message,deviceToken); + return; + } + + /* + * 通过发送redis广播,到集群中的每台实例,获得当前UID绑定了连接并推送 + * @see com.farsunset.hoxin.component.message.PushMessageListener + */ + signalRedisTemplate.push(message); - return ResponseEntity.ok(message.getId()); } } diff --git a/cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/model/Intent.java b/cim-boot-server/src/main/java/com/farsunset/cim/component/redis/KeyValueRedisTemplate.java similarity index 52% rename from cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/model/Intent.java rename to cim-boot-server/src/main/java/com/farsunset/cim/component/redis/KeyValueRedisTemplate.java index 9c970e9..777e3e2 100644 --- a/cim-client-sdk/cim-java-sdk/src/main/java/com/farsunset/cim/sdk/client/model/Intent.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/component/redis/KeyValueRedisTemplate.java @@ -19,52 +19,40 @@ * * *************************************************************************************** */ -package com.farsunset.cim.sdk.client.model; +package com.farsunset.cim.component.redis; -import java.io.Serializable; -import java.util.HashMap; +import com.farsunset.cim.constants.Constants; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; -/** - * java |android 客户端请求结构 - * - */ -public class Intent implements Serializable { - private static final long serialVersionUID = 1L; +@Component +public class KeyValueRedisTemplate extends StringRedisTemplate { - private String action; - - private final HashMap data = new HashMap(); - - public Intent() { + public KeyValueRedisTemplate(RedisConnectionFactory connectionFactory) { + super(connectionFactory); } - public Intent(String action) { - this.action = action; + public void set(String key ,String value) { + super.boundValueOps(key).set(value); } - public String getAction() { - return action; + public String get(String key) { + return super.boundValueOps(key).get(); } - public void setAction(String action) { - this.action = action; + public String getDeviceToken(String uid){ + return super.boundValueOps(String.format(Constants.APNS_DEVICE_TOKEN,uid)).get(); } - public void putExtra(String key, Object value) { - data.put(key, value); + public void openApns(String uid,String deviceToken){ + super.boundValueOps(String.format(Constants.APNS_DEVICE_TOKEN,uid)).set(deviceToken); } - public Object getExtra(String key) { - return data.get(key); + public void closeApns(String uid){ + super.delete(String.format(Constants.APNS_DEVICE_TOKEN,uid)); } - public long getLongExtra(String key, long defValue) { - Object v = getExtra(key); - try { - return Long.parseLong(v.toString()); - } catch (Exception e) { - return defValue; - } - } + } diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/component/redis/SignalRedisTemplate.java b/cim-boot-server/src/main/java/com/farsunset/cim/component/redis/SignalRedisTemplate.java new file mode 100644 index 0000000..7d1ba84 --- /dev/null +++ b/cim-boot-server/src/main/java/com/farsunset/cim/component/redis/SignalRedisTemplate.java @@ -0,0 +1,55 @@ +/* + * Copyright 2013-2019 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.component.redis; + +import com.farsunset.cim.constants.Constants; +import com.farsunset.cim.entity.Session; +import com.farsunset.cim.sdk.server.model.Message; +import com.farsunset.cim.util.JSONUtils; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +@Component +public class SignalRedisTemplate extends StringRedisTemplate { + + public SignalRedisTemplate(LettuceConnectionFactory connectionFactory) { + super(connectionFactory); + connectionFactory.setValidateConnection(true); + } + + /** + * 消息发送到 集群中的每个实例,获取对应长连接进行消息写入 + * @param message + */ + public void push(Message message) { + super.convertAndSend(Constants.PUSH_MESSAGE_INNER_QUEUE, JSONUtils.toJSONString(message)); + } + + /** + * 消息发送到 集群中的每个实例,解决多终端在线冲突问题 + * @param session + */ + public void bind(Session session) { + super.convertAndSend(Constants.BIND_MESSAGE_INNER_QUEUE, JSONUtils.toJSONString(session)); + } +} diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/config/CIMConfig.java b/cim-boot-server/src/main/java/com/farsunset/cim/config/CIMConfig.java index 965ba1d..73f3e2e 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/config/CIMConfig.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/config/CIMConfig.java @@ -1,11 +1,13 @@ package com.farsunset.cim.config; -import com.farsunset.cim.handler.BindHandler; -import com.farsunset.cim.handler.SessionClosedHandler; +import com.farsunset.cim.component.handler.annotation.CIMHandler; +import com.farsunset.cim.sdk.server.group.SessionGroup; +import com.farsunset.cim.sdk.server.group.TagSessionGroup; import com.farsunset.cim.sdk.server.handler.CIMNioSocketAcceptor; import com.farsunset.cim.sdk.server.handler.CIMRequestHandler; -import com.farsunset.cim.sdk.server.model.CIMSession; import com.farsunset.cim.sdk.server.model.SentBody; +import com.farsunset.cim.service.SessionService; +import io.netty.channel.Channel; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.context.ApplicationContext; @@ -15,6 +17,7 @@ import org.springframework.context.annotation.Configuration; import javax.annotation.Resource; import java.util.HashMap; +import java.util.Map; @Configuration public class CIMConfig implements CIMRequestHandler, ApplicationListener { @@ -22,7 +25,20 @@ public class CIMConfig implements CIMRequestHandler, ApplicationListener appHandlerMap = new HashMap<>(); + @Resource + private SessionService sessionService; + + private final HashMap handlerMap = new HashMap<>(); + + @Bean + public SessionGroup sessionGroup() { + return new SessionGroup(); + } + + @Bean + public TagSessionGroup tagSessionGroup() { + return new TagSessionGroup(); + } @Bean(destroyMethod = "destroy") @@ -38,13 +54,13 @@ public class CIMConfig implements CIMRequestHandler, ApplicationListener beans = applicationContext.getBeansOfType(CIMRequestHandler.class); + + for (Map.Entry entry : beans.entrySet()) { + + CIMRequestHandler handler = entry.getValue(); + + CIMHandler annotation = handler.getClass().getAnnotation(CIMHandler.class); + + if (annotation != null){ + handlerMap.put(annotation.key(),handler); + } + } + applicationContext.getBean(CIMNioSocketAcceptor.class).bind(); + + sessionService.deleteLocalhost(); } } \ No newline at end of file diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/config/RedisConfig.java b/cim-boot-server/src/main/java/com/farsunset/cim/config/RedisConfig.java new file mode 100644 index 0000000..cd790a7 --- /dev/null +++ b/cim-boot-server/src/main/java/com/farsunset/cim/config/RedisConfig.java @@ -0,0 +1,62 @@ +/* + * Copyright 2013-2019 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.config; + +import com.farsunset.cim.constants.Constants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.MessageListener; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.listener.ChannelTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; + +import java.util.Objects; + + +@Configuration +@AutoConfigureBefore(RedisAutoConfiguration.class) +public class RedisConfig { + + @Autowired + public RedisConfig(LettuceConnectionFactory connectionFactory, @Value("${spring.profiles.active}") String profile){ + if (Objects.equals("dev",profile)){ + connectionFactory.setValidateConnection(true); + } + } + + @Bean + public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory, + MessageListener pushMessageListener, + MessageListener bindMessageListener){ + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + container.setConnectionFactory(connectionFactory); + container.addMessageListener(pushMessageListener,new ChannelTopic(Constants.PUSH_MESSAGE_INNER_QUEUE)); + container.addMessageListener(bindMessageListener,new ChannelTopic(Constants.BIND_MESSAGE_INNER_QUEUE)); + return container; + } + +} \ No newline at end of file diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/config/SwaggerConfig.java b/cim-boot-server/src/main/java/com/farsunset/cim/config/SwaggerConfig.java new file mode 100644 index 0000000..3dc7eab --- /dev/null +++ b/cim-boot-server/src/main/java/com/farsunset/cim/config/SwaggerConfig.java @@ -0,0 +1,56 @@ +/* + * Copyright 2013-2019 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.oas.annotations.EnableOpenApi; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +@EnableOpenApi +@Configuration +public class SwaggerConfig { + + @Bean + public Docket userApiDocket(ApiInfo apiInfo) { + return new Docket(DocumentationType.OAS_30) + .apiInfo(apiInfo) + .groupName("APP接口") + .select() + .apis(RequestHandlerSelectors.basePackage("com.farsunset.cim.mvc.controller.api")) + .build(); + } + + @Bean + public ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("CIM Push Service APIs.") + .description("CIM客户端接口文档") + .version("2.0") + .build(); + } + +} diff --git a/cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/handler/CIMRequestHandler.java b/cim-boot-server/src/main/java/com/farsunset/cim/constants/Constants.java similarity index 75% rename from cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/handler/CIMRequestHandler.java rename to cim-boot-server/src/main/java/com/farsunset/cim/constants/Constants.java index c6fa04c..9d4b120 100644 --- a/cim-server-sdk/cim-server-sdk-mina/src/main/java/com/farsunset/cim/sdk/server/handler/CIMRequestHandler.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/constants/Constants.java @@ -19,18 +19,15 @@ * * *************************************************************************************** */ -package com.farsunset.cim.sdk.server.handler; +package com.farsunset.cim.constants; +public interface Constants { -import com.farsunset.cim.sdk.server.model.CIMSession; -import com.farsunset.cim.sdk.server.model.SentBody; + String PUSH_MESSAGE_INNER_QUEUE = "signal/channel/PUSH_MESSAGE_INNER_QUEUE"; -public interface CIMRequestHandler { + String BIND_MESSAGE_INNER_QUEUE = "signal/channel/BIND_MESSAGE_INNER_QUEUE"; - /** - * 处理长连接发送的请求 - * @param session - * @param message - */ - void process(CIMSession session, SentBody message); + String PING_MESSAGE_INNER_QUEUE = "signal/channel/PING_MESSAGE_INNER_QUEUE"; + + String APNS_DEVICE_TOKEN = "APNS_OPEN_%s"; } diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/entity/Session.java b/cim-boot-server/src/main/java/com/farsunset/cim/entity/Session.java new file mode 100644 index 0000000..49eb598 --- /dev/null +++ b/cim-boot-server/src/main/java/com/farsunset/cim/entity/Session.java @@ -0,0 +1,240 @@ +/* + * Copyright 2013-2019 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.entity; + + +import javax.persistence.*; +import java.io.Serializable; + +@Entity +@Table(name = "t_hoxin_session") +public class Session implements Serializable { + + private static final transient long serialVersionUID = 1L; + public static final transient int STATE_ACTIVE = 0; + public static final transient int STATE_APNS = 1; + public static final transient int STATE_INACTIVE = 2; + + public static final transient String CHANNEL_IOS = "ios"; + public static final transient String CHANNEL_ANDROID = "android"; + public static final transient String CHANNEL_WINDOWS = "windows"; + public static final transient String CHANNEL_MAC = "mac"; + public static final transient String CHANNEL_WEB = "web"; + + /** + * 数据库主键ID + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id; + + /** + * session绑定的用户账号 + */ + @Column(name = "uid") + private String uid; + + /** + * session在本台服务器上的ID + */ + @Column(name = "nid",length = 32,nullable = false) + private String nid; + + /** + * 客户端ID (设备号码+应用包名),ios为deviceToken + */ + + @Column(name = "device_id",length = 64,nullable = false) + private String deviceId; + + /** + * 终端设备型号 + */ + @Column(name = "device_name") + private String deviceName; + + /** + * session绑定的服务器IP + */ + @Column(name = "host",length = 15,nullable = false) + private String host; + + /** + * 终端设备类型 + */ + @Column(name = "channel",length = 10,nullable = false) + private String channel; + + /** + * 终端应用版本 + */ + @Column(name = "app_version") + private String appVersion; + + /** + * 终端系统版本 + */ + @Column(name = "os_version") + private String osVersion; + + /** + * 登录时间 + */ + @Column(name = "bind_time") + private Long bindTime; + + /** + * 经度 + */ + @Column(name = "longitude") + private Double longitude; + + /** + * 维度 + */ + @Column(name = "latitude") + private Double latitude; + + /** + * 位置 + */ + @Column(name = "location") + private String location; + + /** + * 状态 + */ + private int state; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public String getNid() { + return nid; + } + + public void setNid(String nid) { + this.nid = nid; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public String getChannel() { + return channel; + } + + public void setChannel(String channel) { + this.channel = channel; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getAppVersion() { + return appVersion; + } + + public void setAppVersion(String appVersion) { + this.appVersion = appVersion; + } + + public String getOsVersion() { + return osVersion; + } + + public void setOsVersion(String osVersion) { + this.osVersion = osVersion; + } + + public Long getBindTime() { + return bindTime; + } + + public void setBindTime(Long bindTime) { + this.bindTime = bindTime; + } + + public Double getLongitude() { + return longitude; + } + + public void setLongitude(Double longitude) { + this.longitude = longitude; + } + + public Double getLatitude() { + return latitude; + } + + public void setLatitude(Double latitude) { + this.latitude = latitude; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public int getState() { + return state; + } + + public void setState(int state) { + this.state = state; + } +} diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/handler/BindHandler.java b/cim-boot-server/src/main/java/com/farsunset/cim/handler/BindHandler.java deleted file mode 100644 index abf5fb0..0000000 --- a/cim-boot-server/src/main/java/com/farsunset/cim/handler/BindHandler.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 2013-2019 Xia Jun(3979434@qq.com). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *************************************************************************************** - * * - * Website : http://www.farsunset.com * - * * - *************************************************************************************** - */ -package com.farsunset.cim.handler; - -import com.farsunset.cim.push.CIMMessagePusher; -import com.farsunset.cim.sdk.server.constant.CIMConstant; -import com.farsunset.cim.sdk.server.handler.CIMRequestHandler; -import com.farsunset.cim.sdk.server.model.CIMSession; -import com.farsunset.cim.sdk.server.model.Message; -import com.farsunset.cim.sdk.server.model.ReplyBody; -import com.farsunset.cim.sdk.server.model.SentBody; -import com.farsunset.cim.service.CIMSessionService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.Objects; - - -/* - * 账号绑定实现 - * - */ - -@Component -public class BindHandler implements CIMRequestHandler { - - private final Logger logger = LoggerFactory.getLogger(BindHandler.class); - - @Resource - private CIMSessionService cimSessionService; - - @Value("${server.host}") - private String host; - - @Resource - private CIMMessagePusher defaultMessagePusher; - - @Override - public void process(CIMSession newSession, SentBody body) { - - ReplyBody reply = new ReplyBody(); - reply.setKey(body.getKey()); - reply.setCode(HttpStatus.OK.value()); - reply.setTimestamp(System.currentTimeMillis()); - - try { - - String account = body.get("account"); - newSession.setAccount(account); - newSession.setDeviceId(body.get("deviceId")); - newSession.setHost(host); - newSession.setChannel(body.get("channel")); - newSession.setDeviceModel(body.get("device")); - newSession.setClientVersion(body.get("appVersion")); - newSession.setSystemVersion(body.get("osVersion")); - newSession.setBindTime(System.currentTimeMillis()); - /* - * 由于客户端断线服务端可能会无法获知的情况,客户端重连时,需要关闭旧的连接 - */ - CIMSession oldSession = cimSessionService.get(account); - - /* - * 如果是账号已经在另一台终端登录。则让另一个终端下线 - */ - - if (oldSession != null && fromOtherDevice(newSession,oldSession) && oldSession.isConnected()) { - sendForceOfflineMessage(oldSession, account, newSession.getDeviceModel()); - } - - /* - * 有可能是同一个设备重复连接,则关闭旧的链接,这种情况一般是客户端断网,联网又重新链接上来,之前的旧链接没有来得及通过心跳机制关闭,在这里手动关闭 - * 条件1,连接来自是同一个设备 - * 条件2.2个连接都是同一台服务器 - */ - - if (oldSession != null && !fromOtherDevice(newSession,oldSession) && Objects.equals(oldSession.getHost(),host)) { - closeQuietly(oldSession); - } - - cimSessionService.save(newSession); - - - } catch (Exception exception) { - reply.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value()); - logger.error("Bind has error",exception); - } - - newSession.write(reply); - } - - private boolean fromOtherDevice(CIMSession oldSession ,CIMSession newSession) { - - return !Objects.equals(oldSession.getDeviceId(), newSession.getDeviceId()); - } - - private void sendForceOfflineMessage(CIMSession oldSession, String account, String deviceModel) { - - Message msg = new Message(); - msg.setAction(CIMConstant.MessageAction.ACTION_OFFLINE); - msg.setReceiver(account); - msg.setSender("system"); - msg.setContent(deviceModel); - msg.setId(System.currentTimeMillis()); - - defaultMessagePusher.push(msg); - - closeQuietly(oldSession); - - } - - private void closeQuietly(CIMSession oldSession) { - if (oldSession.isConnected() && Objects.equals(host, oldSession.getHost())) { - oldSession.setAttribute(CIMConstant.KEY_QUIETLY_CLOSE,true); - oldSession.closeOnFlush(); - } - } - -} diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/admin/controller/NavigationController.java b/cim-boot-server/src/main/java/com/farsunset/cim/mvc/controller/admin/NavigationController.java similarity index 97% rename from cim-boot-server/src/main/java/com/farsunset/cim/admin/controller/NavigationController.java rename to cim-boot-server/src/main/java/com/farsunset/cim/mvc/controller/admin/NavigationController.java index b0941f3..b530c8e 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/admin/controller/NavigationController.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/mvc/controller/admin/NavigationController.java @@ -19,7 +19,7 @@ * * *************************************************************************************** */ -package com.farsunset.cim.admin.controller; +package com.farsunset.cim.mvc.controller.admin; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/admin/controller/SessionController.java b/cim-boot-server/src/main/java/com/farsunset/cim/mvc/controller/admin/SessionController.java similarity index 87% rename from cim-boot-server/src/main/java/com/farsunset/cim/admin/controller/SessionController.java rename to cim-boot-server/src/main/java/com/farsunset/cim/mvc/controller/admin/SessionController.java index ed842dd..e1b356b 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/admin/controller/SessionController.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/mvc/controller/admin/SessionController.java @@ -19,9 +19,9 @@ * * *************************************************************************************** */ -package com.farsunset.cim.admin.controller; +package com.farsunset.cim.mvc.controller.admin; -import com.farsunset.cim.service.CIMSessionService; +import com.farsunset.cim.service.SessionService; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -34,11 +34,13 @@ import javax.annotation.Resource; public class SessionController { @Resource - private CIMSessionService cimSessionService; - + private SessionService sessionService; + @GetMapping(value = "/list") public String list(Model model) { - model.addAttribute("sessionList", cimSessionService.list()); + model.addAttribute("sessionList", sessionService.findAll()); return "console/session/manage"; + } + } diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/mvc/controller/api/APNsController.java b/cim-boot-server/src/main/java/com/farsunset/cim/mvc/controller/api/APNsController.java new file mode 100644 index 0000000..66de2da --- /dev/null +++ b/cim-boot-server/src/main/java/com/farsunset/cim/mvc/controller/api/APNsController.java @@ -0,0 +1,69 @@ +/* + * Copyright 2013-2019 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.mvc.controller.api; + +import com.farsunset.cim.service.SessionService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/apns") +@Api(produces = "application/json", tags = "APNs推送相关") +public class APNsController { + + @ApiOperation(httpMethod = "POST", value = "开启apns") + + + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceToken", value = "APNs的deviceToken", paramType = "query", dataTypeClass = String.class, required = true, example = ""), + @ApiImplicitParam(name = "uid", value = "用户ID", paramType = "query", dataTypeClass = String.class,example = "0") + }) + @PostMapping(value = "/open") + public ResponseEntity open(@RequestParam String uid , @RequestParam String deviceToken) { + + sessionService.openApns(uid,deviceToken); + + return ResponseEntity.ok().build(); + } + + @Resource + private SessionService sessionService; + + @ApiOperation(httpMethod = "POST", value = "关闭apns") + @ApiImplicitParam(name = "uid", value = "用户ID", paramType = "query", dataTypeClass = String.class,example = "0") + @PostMapping(value = "/close") + public ResponseEntity close(@RequestParam String uid) { + + sessionService.closeApns(uid); + + return ResponseEntity.ok().build(); + } +} diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/mvc/controller/api/MessageController.java b/cim-boot-server/src/main/java/com/farsunset/cim/mvc/controller/api/MessageController.java new file mode 100644 index 0000000..346042d --- /dev/null +++ b/cim-boot-server/src/main/java/com/farsunset/cim/mvc/controller/api/MessageController.java @@ -0,0 +1,83 @@ +/* + * Copyright 2013-2019 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.mvc.controller.api; + +import com.farsunset.cim.component.push.DefaultMessagePusher; +import com.farsunset.cim.sdk.server.model.Message; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + + +@RestController +@RequestMapping("/api/message") +@Api(produces = "application/json", tags = "消息相关接口" ) +public class MessageController { + + @Resource + private DefaultMessagePusher defaultMessagePusher; + + @ApiOperation(httpMethod = "POST", value = "发送消息") + @ApiImplicitParams({ + @ApiImplicitParam(name = "sender", value = "发送者UID", paramType = "query", dataTypeClass = String.class, required = true, example = ""), + @ApiImplicitParam(name = "receiver", value = "接收者UID", paramType = "query", dataTypeClass = String.class, required = true, example = ""), + @ApiImplicitParam(name = "action", value = "消息动作", paramType = "query", dataTypeClass = String.class, required = true, example = ""), + @ApiImplicitParam(name = "title", value = "消息标题", paramType = "query", dataTypeClass = String.class, example = ""), + @ApiImplicitParam(name = "content", value = "消息内容", paramType = "query", dataTypeClass = String.class, example = ""), + @ApiImplicitParam(name = "format", value = "消息格式", paramType = "query", dataTypeClass = String.class, example = ""), + @ApiImplicitParam(name = "extra", value = "扩展字段", paramType = "query", dataTypeClass = String.class, example = ""), + }) + @PostMapping(value = "/send") + public ResponseEntity send(@RequestParam String sender , + @RequestParam String receiver , + @RequestParam String action , + @RequestParam(required = false) String title , + @RequestParam(required = false) String content , + @RequestParam(required = false) String format , + @RequestParam(required = false) String extra) { + + Message message = new Message(); + message.setSender(sender); + message.setReceiver(receiver); + message.setAction(action); + message.setContent(content); + message.setFormat(format); + message.setTitle(title); + message.setExtra(extra); + + message.setId(System.currentTimeMillis()); + + defaultMessagePusher.push(message); + + return ResponseEntity.ok(message.getId()); + } + + +} diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/push/DefaultMessagePusher.java b/cim-boot-server/src/main/java/com/farsunset/cim/push/DefaultMessagePusher.java deleted file mode 100644 index 26dc94b..0000000 --- a/cim-boot-server/src/main/java/com/farsunset/cim/push/DefaultMessagePusher.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2013-2019 Xia Jun(3979434@qq.com). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *************************************************************************************** - * * - * Website : http://www.farsunset.com * - * * - *************************************************************************************** - */ -package com.farsunset.cim.push; - -import com.farsunset.cim.sdk.server.model.CIMSession; -import com.farsunset.cim.sdk.server.model.Message; -import com.farsunset.cim.service.ApnsService; -import com.farsunset.cim.service.CIMSessionService; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.Objects; - -/* - * 消息发送实现类 - * - */ -@Component -public class DefaultMessagePusher implements CIMMessagePusher { - - @Value("${server.host}") - private String host; - - @Resource - private CIMSessionService cimSessionService; - - - - @Resource - private ApnsService apnsService; - - - /* - * 向用户发送消息 - * - * @param message - */ - @Override - public void push(Message message) { - CIMSession session = cimSessionService.get(message.getReceiver()); - - if(session == null) { - return; - } - - /* - * IOS设备,如果开启了apns,则使用apns推送 - */ - if (session.isIOSChannel() && session.isApnsEnable()) { - apnsService.push(message, session.getDeviceId()); - return; - } - - /* - * 服务器集群时,判断当前session是否连接于本台服务器 - * 如果连接到了其他服务器则转发请求到目标服务器 - */ - if (session.isConnected() && !Objects.equals(host, session.getHost())) { - /* - * @TODO - * 在此调用目标服务器接口来发送,如session.host = 123.123.123.123 - * 调用目标服务器的消息发送接口http://123.123.123.123:8080/message/send - */ - return; - } - - /* - * 如果是Android,浏览器或者windows客户端则直接发送 - */ - if (session.isConnected() && Objects.equals(host, session.getHost())) { - session.write(message); - } - - } - -} diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/repository/SessionRepository.java b/cim-boot-server/src/main/java/com/farsunset/cim/repository/SessionRepository.java index e542217..c76de8d 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/repository/SessionRepository.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/repository/SessionRepository.java @@ -1,34 +1,55 @@ +/* + * Copyright 2013-2019 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ package com.farsunset.cim.repository; -import com.farsunset.cim.sdk.server.model.CIMSession; +import com.farsunset.cim.entity.Session; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -/* - * 正式场景下,使用redis或者数据库来存储session信息 - */ @Repository -public class SessionRepository { +@Transactional(rollbackFor = Exception.class) +public interface SessionRepository extends JpaRepository { - private ConcurrentHashMap map = new ConcurrentHashMap<>(); + @Modifying + @Query("delete from Session where uid = ?1 and nid = ?2") + void delete(String uid,String nid); + @Modifying + @Query("delete from Session where host = ?1 ") + void deleteAll(String host); - public void save(CIMSession session){ - map.put(session.getAccount(),session); - } + @Modifying + @Query("update Session set state = ?3 where uid = ?1 and nid = ?2") + void updateState(String uid,String nid,int state); - public CIMSession get(String account){ - return map.get(account); - } + @Modifying + @Query("update Session set state = " + Session.STATE_APNS + " where uid = ?1 and channel = ?2") + void openApns(String uid,String channel); - public void remove(String account){ - map.remove(account); - } - - public List findAll(){ - return new LinkedList<>(map.values()); - } + @Modifying + @Query("update Session set state = " + Session.STATE_ACTIVE + " where uid = ?1 and channel = ?2") + void closeApns(String uid,String channel); } diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/service/ApnsService.java b/cim-boot-server/src/main/java/com/farsunset/cim/service/APNsService.java similarity index 97% rename from cim-boot-server/src/main/java/com/farsunset/cim/service/ApnsService.java rename to cim-boot-server/src/main/java/com/farsunset/cim/service/APNsService.java index 7586a80..eebf113 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/service/ApnsService.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/service/APNsService.java @@ -23,7 +23,7 @@ package com.farsunset.cim.service; import com.farsunset.cim.sdk.server.model.Message; -public interface ApnsService { +public interface APNsService { void push(Message message, String deviceToken); } diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/service/CIMSessionService.java b/cim-boot-server/src/main/java/com/farsunset/cim/service/SessionService.java similarity index 69% rename from cim-boot-server/src/main/java/com/farsunset/cim/service/CIMSessionService.java rename to cim-boot-server/src/main/java/com/farsunset/cim/service/SessionService.java index 4837c21..7e74231 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/service/CIMSessionService.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/service/SessionService.java @@ -21,23 +21,30 @@ */ package com.farsunset.cim.service; -import com.farsunset.cim.sdk.server.model.CIMSession; + +import com.farsunset.cim.entity.Session; import java.util.List; - -/* - * 集群 session管理实现示例, 各位可以自行实现 AbstractSessionManager接口来实现自己的 session管理 服务器集群时 - * 须要将CIMSession 信息存入数据库或者redis中 等 第三方存储空间中,便于所有服务器都可以访问 +/** + * 存储连接信息,便于查看用户的链接信息 */ -public interface CIMSessionService { +public interface SessionService { - void save(CIMSession session); + void add(Session session); - CIMSession get(String account); + void delete(String uid,String nid); - List list(); - - void remove(String account); + /** + * 删除本机的连接记录 + */ + void deleteLocalhost(); + void updateState(String uid,String nid,int state); + + void openApns(String uid,String deviceToken); + + void closeApns(String uid); + + List findAll(); } diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/service/impl/JavaApnsServiceImpl.java b/cim-boot-server/src/main/java/com/farsunset/cim/service/impl/APNsServiceImpl.java similarity index 55% rename from cim-boot-server/src/main/java/com/farsunset/cim/service/impl/JavaApnsServiceImpl.java rename to cim-boot-server/src/main/java/com/farsunset/cim/service/impl/APNsServiceImpl.java index 31a4527..d4f2196 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/service/impl/JavaApnsServiceImpl.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/service/impl/APNsServiceImpl.java @@ -25,29 +25,38 @@ import cn.teaey.apns4j.Apns4j; import cn.teaey.apns4j.network.ApnsChannel; import cn.teaey.apns4j.network.ApnsChannelFactory; import cn.teaey.apns4j.network.ApnsGateway; +import cn.teaey.apns4j.protocol.ApnsPayload; import com.farsunset.cim.sdk.server.model.Message; -import com.farsunset.cim.service.ApnsService; -import com.farsunset.cim.util.ApnsPayloadCompat; +import com.farsunset.cim.service.APNsService; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.InputStream; @Service -public class JavaApnsServiceImpl implements ApnsService { +public class APNsServiceImpl implements APNsService { - private static final Logger LOGGER = LoggerFactory.getLogger(JavaApnsServiceImpl.class); + private static final Logger LOGGER = LoggerFactory.getLogger(APNsServiceImpl.class); + + private final ApnsChannelFactory apnsChannelFactory; + + @Autowired + public APNsServiceImpl(@Value("${apple.apns.p12.file}") String p12File, + @Value("${apple.apns.p12.password}") String password, + @Value("${apple.apns.debug}") boolean isDebug){ + InputStream stream = getClass().getResourceAsStream(p12File); + apnsChannelFactory = Apns4j.newChannelFactoryBuilder() + .keyStoreMeta(stream) + .keyStorePwd(password) + .apnsGateway(isDebug ? ApnsGateway.DEVELOPMENT : ApnsGateway.PRODUCTION) + .build(); + } - @Value("${apple.apns.p12.password}") - private String password; - @Value("${apple.apns.p12.file}") - private String p12Path; - @Value("${apple.apns.debug}") - private boolean isDebug; @SuppressWarnings("deprecation") @Override @@ -56,31 +65,30 @@ public class JavaApnsServiceImpl implements ApnsService { if(StringUtils.isBlank(deviceToken)) { return ; } - - InputStream stream = getClass().getResourceAsStream(p12Path); - ApnsChannelFactory apnsChannelFactory = Apns4j.newChannelFactoryBuilder() - .keyStoreMeta(stream) - .keyStorePwd(password) - .apnsGateway(isDebug ? ApnsGateway.DEVELOPMENT : ApnsGateway.PRODUCTION) - .build(); ApnsChannel apnsChannel = apnsChannelFactory.newChannel(); + ApnsPayload apnsPayload = new ApnsPayload(); + + apnsPayload.alert("您有一条新的消息"); + + apnsPayload.sound("default"); + apnsPayload.badge(1); + apnsPayload.extend("id",message.getId()); + apnsPayload.extend("action",message.getAction()); + apnsPayload.extend("content",message.getContent()); + apnsPayload.extend("sender",message.getSender()); + apnsPayload.extend("receiver",message.getReceiver()); + apnsPayload.extend("format",message.getFormat()); + apnsPayload.extend("extra",message.getExtra()); + apnsPayload.extend("timestamp",message.getTimestamp()); try { - ApnsPayloadCompat apnsPayload = new ApnsPayloadCompat(); - apnsPayload.setAction(message.getAction()); - apnsPayload.setContent(message.getContent()); - apnsPayload.setSender(message.getSender()); - apnsPayload.setFormat(message.getFormat()); - apnsPayload.setReceiver(message.getReceiver()); apnsChannel.send(deviceToken, apnsPayload); - - LOGGER.info(deviceToken +"\r\ndata: {}",apnsPayload.toJsonString()); + LOGGER.info("APNs push done.\ndeviceToken : {} \napnsPayload : {}",deviceToken,apnsPayload.toJsonString()); }catch(Exception exception) { - LOGGER.error("Apns has error",exception); + LOGGER.error("APNs push failed",exception); }finally { - apnsChannel.close(); - IOUtils.closeQuietly(stream); + IOUtils.closeQuietly(apnsChannel); } } } diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/service/impl/CIMSessionServiceImpl.java b/cim-boot-server/src/main/java/com/farsunset/cim/service/impl/CIMSessionServiceImpl.java deleted file mode 100644 index 696b0be..0000000 --- a/cim-boot-server/src/main/java/com/farsunset/cim/service/impl/CIMSessionServiceImpl.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2013-2019 Xia Jun(3979434@qq.com). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *************************************************************************************** - * * - * Website : http://www.farsunset.com * - * * - *************************************************************************************** - */ -package com.farsunset.cim.service.impl; - - -import com.farsunset.cim.repository.SessionRepository; -import com.farsunset.cim.sdk.server.handler.CIMNioSocketAcceptor; -import com.farsunset.cim.sdk.server.model.CIMSession; -import com.farsunset.cim.service.CIMSessionService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; - - -@Service -public class CIMSessionServiceImpl implements CIMSessionService { - - @Resource - private CIMNioSocketAcceptor nioSocketAcceptor; - - @Resource - private SessionRepository sessionRepository; - - @Override - public void save(CIMSession session) { - sessionRepository.save(session); - } - - /* - * - * @param account 用户id - * @return - */ - @Override - public CIMSession get(String account) { - - CIMSession session = sessionRepository.get(account); - - if (session != null){ - session.setSession(nioSocketAcceptor.getManagedSession(session.getNid())); - } - - return session; - } - - @Override - public void remove(String account) { - sessionRepository.remove(account); - } - - @Override - public List list() { - return sessionRepository.findAll(); - } - -} diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/service/impl/SessionServiceImpl.java b/cim-boot-server/src/main/java/com/farsunset/cim/service/impl/SessionServiceImpl.java new file mode 100644 index 0000000..3ddf8da --- /dev/null +++ b/cim-boot-server/src/main/java/com/farsunset/cim/service/impl/SessionServiceImpl.java @@ -0,0 +1,89 @@ +/* + * Copyright 2013-2019 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.service.impl; + +import com.farsunset.cim.component.redis.KeyValueRedisTemplate; +import com.farsunset.cim.entity.Session; +import com.farsunset.cim.repository.SessionRepository; +import com.farsunset.cim.service.SessionService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.List; + +@Service +public class SessionServiceImpl implements SessionService { + + @Resource + private SessionRepository sessionRepository; + + @Resource + private KeyValueRedisTemplate keyValueRedisTemplate; + + + private final String host; + + public SessionServiceImpl() throws UnknownHostException { + host = InetAddress.getLocalHost().getHostAddress(); + } + + @Override + public void add(Session session) { + session.setBindTime(System.currentTimeMillis()); + session.setHost(host); + sessionRepository.save(session); + } + + @Override + public void delete(String uid, String nid) { + sessionRepository.delete(uid,nid); + } + + @Override + public void deleteLocalhost() { + sessionRepository.deleteAll(host); + } + + @Override + public void updateState(String uid, String nid, int state) { + sessionRepository.updateState(uid,nid,state); + } + + @Override + public void openApns(String uid,String deviceToken) { + keyValueRedisTemplate.openApns(uid,deviceToken); + sessionRepository.openApns(uid,Session.CHANNEL_IOS); + } + + @Override + public void closeApns(String uid) { + keyValueRedisTemplate.closeApns(uid); + sessionRepository.closeApns(uid,Session.CHANNEL_IOS); + } + + @Override + public List findAll() { + return sessionRepository.findAll(); + } +} diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/util/JSONUtils.java b/cim-boot-server/src/main/java/com/farsunset/cim/util/JSONUtils.java new file mode 100644 index 0000000..e53a101 --- /dev/null +++ b/cim-boot-server/src/main/java/com/farsunset/cim/util/JSONUtils.java @@ -0,0 +1,78 @@ +/* + * Copyright 2013-2019 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.util; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.json.JsonReadFeature; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.json.JsonMapper; + +import java.io.IOException; +import java.util.List; + +public final class JSONUtils { + private static final JsonMapper OBJECT_MAPPER = JsonMapper.builder() + .enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS) + .enable(JsonReadFeature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .serializationInclusion(JsonInclude.Include.NON_NULL) + .build(); + + + public static String toJSONString(Object data) { + + try { + return OBJECT_MAPPER.writeValueAsString(data); + } catch (JsonProcessingException e) { + throw new IllegalArgumentException(e); + } + + } + + public static T fromJson(String str, Class clazz) { + try { + return OBJECT_MAPPER.readValue(str, clazz); + } catch (IOException e) { + throw new IllegalArgumentException(e); + } + } + + public static T fromJson(byte[] data, Class clazz) { + try { + return OBJECT_MAPPER.readValue(data, clazz); + } catch (IOException e) { + throw new IllegalArgumentException(e); + } + } + + + public static List parseList(String str, Class clazz) { + JavaType javaType = OBJECT_MAPPER.getTypeFactory().constructCollectionLikeType(List.class,clazz); + try { + return OBJECT_MAPPER.readValue(str, javaType); + } catch (IOException e) { + throw new IllegalArgumentException(e); + } + } +} diff --git a/cim-boot-server/src/main/resources/apns/app.p12 b/cim-boot-server/src/main/resources/apns/app.p12 new file mode 100644 index 0000000000000000000000000000000000000000..0e93c7f0b0ce132fb3dfd3ed14a21499fcf9b3dc GIT binary patch literal 3220 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 + + + true + + [%thread] %d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %cyan(%logger{32}) - %msg %n + + + + + + diff --git a/cim-boot-server/src/main/resources/page/console/nav.html b/cim-boot-server/src/main/resources/page/console/nav.html index dd2630a..d3fa581 100644 --- a/cim-boot-server/src/main/resources/page/console/nav.html +++ b/cim-boot-server/src/main/resources/page/console/nav.html @@ -3,9 +3,14 @@