diff --git a/im-client/src/main/java/com/bx/imclient/IMClient.java b/im-client/src/main/java/com/bx/imclient/IMClient.java index 4891023..68b6b74 100644 --- a/im-client/src/main/java/com/bx/imclient/IMClient.java +++ b/im-client/src/main/java/com/bx/imclient/IMClient.java @@ -14,16 +14,27 @@ public class IMClient { @Autowired private MessageListenerMulticaster listenerMulticaster; - @Autowired private IMSender imSender; - public void sendPrivateMessage(Long userId, PrivateMessageInfo... messageInfo){ - imSender.sendPrivateMessage(userId,messageInfo); + /** + * 发送私聊消息 + * + * @param recvId 接收用户id + * @param messageInfo 消息体,将转成json发送到客户端 + */ + public void sendPrivateMessage(Long recvId, PrivateMessageInfo... messageInfo){ + imSender.sendPrivateMessage(recvId,messageInfo); } - public void sendGroupMessage(List userTokens, GroupMessageInfo... messageInfo){ - imSender.sendGroupMessage(userTokens,messageInfo); + /** + * 发送群聊消息 + * + * @param recvIds 群聊用户id列表 + * @param messageInfo 消息体,将转成json发送到客户端 + */ + public void sendGroupMessage(List recvIds, GroupMessageInfo... messageInfo){ + imSender.sendGroupMessage(recvIds,messageInfo); } diff --git a/im-client/src/main/java/com/bx/imclient/listener/MessageListenerMulticaster.java b/im-client/src/main/java/com/bx/imclient/listener/MessageListenerMulticaster.java index 9779574..8d91a3c 100644 --- a/im-client/src/main/java/com/bx/imclient/listener/MessageListenerMulticaster.java +++ b/im-client/src/main/java/com/bx/imclient/listener/MessageListenerMulticaster.java @@ -13,14 +13,13 @@ import java.util.List; @Component public class MessageListenerMulticaster { - @Autowired(required = false) private List messageListeners = Collections.emptyList(); public void multicast(IMListenerType type, SendResult result){ for(MessageListener listener:messageListeners){ IMListener annotation = listener.getClass().getAnnotation(IMListener.class); - if(annotation.type().equals(type)){ + if(annotation!=null && (annotation.type().equals(IMListenerType.ALL) || annotation.type().equals(type))){ listener.process(result); } } diff --git a/im-commom/src/main/java/com/bx/imcommon/enums/IMListenerType.java b/im-commom/src/main/java/com/bx/imcommon/enums/IMListenerType.java index 2a5f118..d6da555 100644 --- a/im-commom/src/main/java/com/bx/imcommon/enums/IMListenerType.java +++ b/im-commom/src/main/java/com/bx/imcommon/enums/IMListenerType.java @@ -1,9 +1,9 @@ package com.bx.imcommon.enums; public enum IMListenerType { - - PRIVATE_MESSAGE(0,"私聊消息"), - GROUP_MESSAGE(1,"群聊消息"); + ALL(0,"全部消息"), + PRIVATE_MESSAGE(1,"私聊消息"), + GROUP_MESSAGE(2,"群聊消息"); private Integer code; diff --git a/im-commom/src/main/java/com/bx/imcommon/model/GroupMessageInfo.java b/im-commom/src/main/java/com/bx/imcommon/model/GroupMessageInfo.java index f128b4a..7706868 100644 --- a/im-commom/src/main/java/com/bx/imcommon/model/GroupMessageInfo.java +++ b/im-commom/src/main/java/com/bx/imcommon/model/GroupMessageInfo.java @@ -9,16 +9,34 @@ import java.util.Date; @Data public class GroupMessageInfo { + /* + * 消息id + */ private Long id; + /* + * 群聊id + */ private Long groupId; + /* + * 发送者id + */ private Long sendId; + /* + * 消息内容 + */ private String content; + /* + * 消息内容类型 具体枚举值由应用层定义 + */ private Integer type; + /** + * 发送时间 + */ @JsonSerialize(using = DateToLongSerializer.class) private Date sendTime; } diff --git a/im-commom/src/main/java/com/bx/imcommon/model/IMRecvInfo.java b/im-commom/src/main/java/com/bx/imcommon/model/IMRecvInfo.java index 2e67da3..289e2fc 100644 --- a/im-commom/src/main/java/com/bx/imcommon/model/IMRecvInfo.java +++ b/im-commom/src/main/java/com/bx/imcommon/model/IMRecvInfo.java @@ -7,10 +7,19 @@ import java.util.List; @Data public class IMRecvInfo { + /* + * 命令类型 + */ private Integer cmd; + /* + * 接收者id列表 + */ private List recvIds; + /* + * 推送消息体 + */ private T data; } diff --git a/im-commom/src/main/java/com/bx/imcommon/model/IMSendInfo.java b/im-commom/src/main/java/com/bx/imcommon/model/IMSendInfo.java index cc77e95..769851b 100644 --- a/im-commom/src/main/java/com/bx/imcommon/model/IMSendInfo.java +++ b/im-commom/src/main/java/com/bx/imcommon/model/IMSendInfo.java @@ -5,7 +5,14 @@ import lombok.Data; @Data public class IMSendInfo { + /* + * 命令 + */ private Integer cmd; + + /* + * 推送消息体 + */ private T data; } diff --git a/im-commom/src/main/java/com/bx/imcommon/model/PrivateMessageInfo.java b/im-commom/src/main/java/com/bx/imcommon/model/PrivateMessageInfo.java index 2c82f34..be5c753 100644 --- a/im-commom/src/main/java/com/bx/imcommon/model/PrivateMessageInfo.java +++ b/im-commom/src/main/java/com/bx/imcommon/model/PrivateMessageInfo.java @@ -9,16 +9,34 @@ import java.util.Date; @Data public class PrivateMessageInfo { + /* + * 消息id + */ private long id; + /* + * 发送者id + */ private Long sendId; + /* + * 接收者id + */ private Long recvId; + /* + * 发送内容 + */ private String content; + /* + * 消息内容类型 具体枚举值由应用层定义 + */ private Integer type; + /** + * 发送时间 + */ @JsonSerialize(using = DateToLongSerializer.class) private Date sendTime; } diff --git a/im-commom/src/main/java/com/bx/imcommon/model/SendResult.java b/im-commom/src/main/java/com/bx/imcommon/model/SendResult.java index 16d3ec8..66ea316 100644 --- a/im-commom/src/main/java/com/bx/imcommon/model/SendResult.java +++ b/im-commom/src/main/java/com/bx/imcommon/model/SendResult.java @@ -6,12 +6,24 @@ import lombok.Data; @Data public class SendResult { + /* + * 接收者id + */ private Long recvId; + /* + * 发送状态 + */ private IMSendStatus status; + /* + * 失败原因 + */ private String failReason=""; + /* + * 消息体(透传) + */ private T messageInfo; } diff --git a/im-server/src/main/java/com/bx/imserver/IMServerApp.java b/im-server/src/main/java/com/bx/imserver/IMServerApp.java index 3cd2947..236d5a8 100644 --- a/im-server/src/main/java/com/bx/imserver/IMServerApp.java +++ b/im-server/src/main/java/com/bx/imserver/IMServerApp.java @@ -1,7 +1,7 @@ package com.bx.imserver; -import com.bx.imserver.websocket.WebsocketServer; +import com.bx.imserver.ws.WebsocketServer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; diff --git a/im-server/src/main/java/com/bx/imserver/websocket/processor/GroupMessageProcessor.java b/im-server/src/main/java/com/bx/imserver/processor/GroupMessageProcessor.java similarity index 94% rename from im-server/src/main/java/com/bx/imserver/websocket/processor/GroupMessageProcessor.java rename to im-server/src/main/java/com/bx/imserver/processor/GroupMessageProcessor.java index 473b506..ee1f517 100644 --- a/im-server/src/main/java/com/bx/imserver/websocket/processor/GroupMessageProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/processor/GroupMessageProcessor.java @@ -1,4 +1,4 @@ -package com.bx.imserver.websocket.processor; +package com.bx.imserver.processor; import com.bx.imcommon.contant.RedisKey; import com.bx.imcommon.enums.IMCmdType; @@ -7,7 +7,7 @@ import com.bx.imcommon.model.GroupMessageInfo; import com.bx.imcommon.model.IMRecvInfo; import com.bx.imcommon.model.IMSendInfo; import com.bx.imcommon.model.SendResult; -import com.bx.imserver.websocket.WebsocketChannelCtxHolder; +import com.bx.imserver.util.UserChannelCtxHolder; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -32,7 +32,7 @@ public class GroupMessageProcessor extends MessageProcessor { @Override synchronized public void process(ChannelHandlerContext ctx, LoginInfo loginInfo) { log.info("用户登录,userId:{}",loginInfo.getUserId()); - ChannelHandlerContext context = WebsocketChannelCtxHolder.getChannelCtx(loginInfo.getUserId()); + ChannelHandlerContext context = UserChannelCtxHolder.getChannelCtx(loginInfo.getUserId()); if(context != null){ // 不允许多地登录,强制下线 IMSendInfo sendInfo = new IMSendInfo(); @@ -40,7 +40,7 @@ public class LoginProcessor extends MessageProcessor { context.channel().writeAndFlush(sendInfo); } // 绑定用户和channel - WebsocketChannelCtxHolder.addChannelCtx(loginInfo.getUserId(),ctx); + UserChannelCtxHolder.addChannelCtx(loginInfo.getUserId(),ctx); // 设置用户id属性 AttributeKey attr = AttributeKey.valueOf("USER_ID"); ctx.channel().attr(attr).set(loginInfo.getUserId()); diff --git a/im-server/src/main/java/com/bx/imserver/websocket/processor/MessageProcessor.java b/im-server/src/main/java/com/bx/imserver/processor/MessageProcessor.java similarity index 85% rename from im-server/src/main/java/com/bx/imserver/websocket/processor/MessageProcessor.java rename to im-server/src/main/java/com/bx/imserver/processor/MessageProcessor.java index 9b156a9..a5ebc5e 100644 --- a/im-server/src/main/java/com/bx/imserver/websocket/processor/MessageProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/processor/MessageProcessor.java @@ -1,4 +1,4 @@ -package com.bx.imserver.websocket.processor; +package com.bx.imserver.processor; import io.netty.channel.ChannelHandlerContext; diff --git a/im-server/src/main/java/com/bx/imserver/websocket/processor/PrivateMessageProcessor.java b/im-server/src/main/java/com/bx/imserver/processor/PrivateMessageProcessor.java similarity index 93% rename from im-server/src/main/java/com/bx/imserver/websocket/processor/PrivateMessageProcessor.java rename to im-server/src/main/java/com/bx/imserver/processor/PrivateMessageProcessor.java index 8c9fd61..a977f0d 100644 --- a/im-server/src/main/java/com/bx/imserver/websocket/processor/PrivateMessageProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/processor/PrivateMessageProcessor.java @@ -1,4 +1,4 @@ -package com.bx.imserver.websocket.processor; +package com.bx.imserver.processor; import com.bx.imcommon.contant.RedisKey; import com.bx.imcommon.enums.IMCmdType; @@ -7,7 +7,7 @@ import com.bx.imcommon.model.IMRecvInfo; import com.bx.imcommon.model.IMSendInfo; import com.bx.imcommon.model.PrivateMessageInfo; import com.bx.imcommon.model.SendResult; -import com.bx.imserver.websocket.WebsocketChannelCtxHolder; +import com.bx.imserver.util.UserChannelCtxHolder; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -27,7 +27,7 @@ public class PrivateMessageProcessor extends MessageProcessor diff --git a/im-server/src/main/java/com/bx/imserver/websocket/WebSocketHandler.java b/im-server/src/main/java/com/bx/imserver/ws/WebSocketHandler.java similarity index 90% rename from im-server/src/main/java/com/bx/imserver/websocket/WebSocketHandler.java rename to im-server/src/main/java/com/bx/imserver/ws/WebSocketHandler.java index 3622deb..9d76477 100644 --- a/im-server/src/main/java/com/bx/imserver/websocket/WebSocketHandler.java +++ b/im-server/src/main/java/com/bx/imserver/ws/WebSocketHandler.java @@ -1,11 +1,12 @@ -package com.bx.imserver.websocket; +package com.bx.imserver.ws; import com.bx.imcommon.contant.RedisKey; import com.bx.imcommon.enums.IMCmdType; import com.bx.imcommon.model.IMSendInfo; +import com.bx.imserver.processor.MessageProcessor; +import com.bx.imserver.processor.ProcessorFactory; import com.bx.imserver.util.SpringContextHolder; -import com.bx.imserver.websocket.processor.MessageProcessor; -import com.bx.imserver.websocket.processor.ProcessorFactory; +import com.bx.imserver.util.UserChannelCtxHolder; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.timeout.IdleState; @@ -66,11 +67,11 @@ public class WebSocketHandler extends SimpleChannelInboundHandler { public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { AttributeKey attr = AttributeKey.valueOf("USER_ID"); Long userId = ctx.channel().attr(attr).get(); - ChannelHandlerContext context = WebsocketChannelCtxHolder.getChannelCtx(userId); + ChannelHandlerContext context = UserChannelCtxHolder.getChannelCtx(userId); // 判断一下,避免异地登录导致的误删 if(context != null && ctx.channel().id().equals(context.channel().id())){ // 移除channel - WebsocketChannelCtxHolder.removeChannelCtx(userId); + UserChannelCtxHolder.removeChannelCtx(userId); // 用户下线 RedisTemplate redisTemplate = SpringContextHolder.getBean("redisTemplate"); String key = RedisKey.IM_USER_SERVER_ID + userId; diff --git a/im-server/src/main/java/com/bx/imserver/websocket/WebsocketServer.java b/im-server/src/main/java/com/bx/imserver/ws/WebsocketServer.java similarity index 96% rename from im-server/src/main/java/com/bx/imserver/websocket/WebsocketServer.java rename to im-server/src/main/java/com/bx/imserver/ws/WebsocketServer.java index 4e22237..b51d33d 100644 --- a/im-server/src/main/java/com/bx/imserver/websocket/WebsocketServer.java +++ b/im-server/src/main/java/com/bx/imserver/ws/WebsocketServer.java @@ -1,8 +1,8 @@ -package com.bx.imserver.websocket; +package com.bx.imserver.ws; import com.bx.imcommon.contant.RedisKey; -import com.bx.imserver.websocket.endecode.MessageProtocolDecoder; -import com.bx.imserver.websocket.endecode.MessageProtocolEncoder; +import com.bx.imserver.ws.endecode.MessageProtocolDecoder; +import com.bx.imserver.ws.endecode.MessageProtocolEncoder; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; diff --git a/im-server/src/main/java/com/bx/imserver/websocket/endecode/MessageProtocolDecoder.java b/im-server/src/main/java/com/bx/imserver/ws/endecode/MessageProtocolDecoder.java similarity index 94% rename from im-server/src/main/java/com/bx/imserver/websocket/endecode/MessageProtocolDecoder.java rename to im-server/src/main/java/com/bx/imserver/ws/endecode/MessageProtocolDecoder.java index 7cb69a3..0ed8342 100644 --- a/im-server/src/main/java/com/bx/imserver/websocket/endecode/MessageProtocolDecoder.java +++ b/im-server/src/main/java/com/bx/imserver/ws/endecode/MessageProtocolDecoder.java @@ -1,4 +1,4 @@ -package com.bx.imserver.websocket.endecode; +package com.bx.imserver.ws.endecode; import com.bx.imcommon.model.IMSendInfo; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/im-server/src/main/java/com/bx/imserver/websocket/endecode/MessageProtocolEncoder.java b/im-server/src/main/java/com/bx/imserver/ws/endecode/MessageProtocolEncoder.java similarity index 94% rename from im-server/src/main/java/com/bx/imserver/websocket/endecode/MessageProtocolEncoder.java rename to im-server/src/main/java/com/bx/imserver/ws/endecode/MessageProtocolEncoder.java index 6a30bac..a99946b 100644 --- a/im-server/src/main/java/com/bx/imserver/websocket/endecode/MessageProtocolEncoder.java +++ b/im-server/src/main/java/com/bx/imserver/ws/endecode/MessageProtocolEncoder.java @@ -1,4 +1,4 @@ -package com.bx.imserver.websocket.endecode; +package com.bx.imserver.ws.endecode; import com.bx.imcommon.model.IMSendInfo; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/im-ui/src/api/wssocket.js b/im-ui/src/api/wssocket.js index b365ef6..0bf7300 100644 --- a/im-ui/src/api/wssocket.js +++ b/im-ui/src/api/wssocket.js @@ -2,14 +2,14 @@ var websock = null; let rec; //断线重连后,延迟5秒重新创建WebSocket连接 rec用来存储延迟请求的代码 let isConnect = false; //连接标识 避免重复连接 let wsurl = ""; -let $store = null; +let userId = null; let messageCallBack = null; let openCallBack = null; let hasLogin = false; -let createWebSocket = (url, store) => { - $store = store; +let createWebSocket = (url, id) => { wsurl = url; + userId = id; initWebSocket(); }; @@ -45,7 +45,7 @@ let initWebSocket = () => { // 发送登录命令 let loginInfo = { cmd: 0, - data: {userId: $store.state.userStore.userInfo.id} + data: {userId: userId} }; websock.send(JSON.stringify(loginInfo)); @@ -88,7 +88,7 @@ var heartCheck = { let heartBeat = { cmd: 1, data: { - userId: $store.state.userStore.userInfo.id + userId: userId } }; websock.send(JSON.stringify(heartBeat)) @@ -139,8 +139,6 @@ function onopen(callback) { } - - // 将方法暴露出去 export { createWebSocket, diff --git a/im-ui/src/view/Home.vue b/im-ui/src/view/Home.vue index f50ab7f..4bc2a62 100644 --- a/im-ui/src/view/Home.vue +++ b/im-ui/src/view/Home.vue @@ -63,7 +63,7 @@ init(userInfo) { this.$store.commit("setUserInfo", userInfo); this.$store.commit("initStore"); - this.$wsApi.createWebSocket(process.env.VUE_APP_WS_URL, this.$store); + this.$wsApi.createWebSocket(process.env.VUE_APP_WS_URL, userInfo.id); this.$wsApi.onopen(() => { this.pullUnreadMessage(); });