From c4e73a0d43256029f2312fb006f3cd5f011dd45e Mon Sep 17 00:00:00 2001 From: jia <2744404105@qq.com> Date: Wed, 27 Mar 2024 14:16:31 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=8A=E5=A4=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bwie-common/pom.xml | 1 + .../java/com/bwie/common/domain/Chat.java | 28 +++ .../java/com/bwie/common/domain/Info.java | 46 +++++ .../java/com/bwie/common/domain/Message.java | 30 +++ .../com/bwie/chat/handle/WebScoketHandle.java | 186 ++++++++++++++++++ 5 files changed, 291 insertions(+) create mode 100644 bwie-common/src/main/java/com/bwie/common/domain/Chat.java create mode 100644 bwie-common/src/main/java/com/bwie/common/domain/Info.java create mode 100644 bwie-common/src/main/java/com/bwie/common/domain/Message.java create mode 100644 bwie-modules/bwie-chat/src/main/java/com/bwie/chat/handle/WebScoketHandle.java diff --git a/bwie-common/pom.xml b/bwie-common/pom.xml index 6f86910..b3ec386 100644 --- a/bwie-common/pom.xml +++ b/bwie-common/pom.xml @@ -116,5 +116,6 @@ fastjson2 2.0.42 + diff --git a/bwie-common/src/main/java/com/bwie/common/domain/Chat.java b/bwie-common/src/main/java/com/bwie/common/domain/Chat.java new file mode 100644 index 0000000..c4d8646 --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/domain/Chat.java @@ -0,0 +1,28 @@ +package com.bwie.common.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Chat { + private Long ChatId; + private Long sendId; + private Long receiveId; + private String chatText; + private Integer isUp; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date craeteTime; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + private Integer isDelete; + private Integer isRead; +} diff --git a/bwie-common/src/main/java/com/bwie/common/domain/Info.java b/bwie-common/src/main/java/com/bwie/common/domain/Info.java new file mode 100644 index 0000000..d2a4529 --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/domain/Info.java @@ -0,0 +1,46 @@ +package com.bwie.common.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Info { + /* + id + */ + private Long userId; + /* + 姓名 + */ + private String userName; + /* + 手机号 + */ + private String userTel; + + /* + 公司 + */ + private String company; + /* + 积分 + */ + private Integer point; + + /* + 登陆人身份【0-经纪人 1-用户】 + */ + private Integer userRole; + + +} diff --git a/bwie-common/src/main/java/com/bwie/common/domain/Message.java b/bwie-common/src/main/java/com/bwie/common/domain/Message.java new file mode 100644 index 0000000..2e7e2fa --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/domain/Message.java @@ -0,0 +1,30 @@ +package com.bwie.common.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Message { + private Long messageId; + private Long userId; + private String messageText; + private Integer isUp; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date craeteTime; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + private Integer isDelete; + private Integer isRead; + + + +} diff --git a/bwie-modules/bwie-chat/src/main/java/com/bwie/chat/handle/WebScoketHandle.java b/bwie-modules/bwie-chat/src/main/java/com/bwie/chat/handle/WebScoketHandle.java new file mode 100644 index 0000000..bd77362 --- /dev/null +++ b/bwie-modules/bwie-chat/src/main/java/com/bwie/chat/handle/WebScoketHandle.java @@ -0,0 +1,186 @@ +package com.bwie.chat.handle; + +import com.bwie.chat.entry.CodeEnum; +import com.bwie.common.result.Result; +import com.mysql.cj.protocol.x.Notice; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.socket.*; + +import java.io.IOException; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +@Slf4j +public class WebScoketHandle implements WebSocketHandler { + // 存放 sessionId 与 session + private static Map SESSIONS = new ConcurrentHashMap<>(); + // 在线用户列表 + private static List ONLINE_USERS = new ArrayList<>(); + // 消息列表 + private static List msgList = new ArrayList<>(); + // 公告 + private static Notice notice = new Notice(); + + /** + * WebSocket 连接建立后调用的方法,通常用于处理连接建立后的业务逻辑。 + * @param session + * @throws Exception + */ + @Override + public void afterConnectionEstablished(WebSocketSession session) throws Exception { + log.info("WebSocket 连接已打开:" + session.getId()); + // 获取请求路径 判断是否携带用户名 + String uri = session.getUri().toString(); + // ws://localhost:8080/username=zxwy&id=1 + log.info(uri); + // 获取id 与 用户名 + String id = uri.substring(uri.lastIndexOf('=')+1); + uri = uri.substring(0,uri.lastIndexOf('&')); + String username = uri.substring(uri.lastIndexOf('=')+1); + + if ("".equals(username)){ + session.sendMessage(new TextMessage(JsonUtils.toJson(Result.error(CodeEnum.NOT_USERNAME)))); + return; + } + User user = new User(); + user.setUsername(username); + user.setId(Integer.valueOf(id)); + + // 判断当前用户是否已经连接过 + List onlineUser = ONLINE_USERS.stream() + .filter(tmp -> tmp.getId()==user.getId()) + .collect(Collectors.toList()); + // 如果存在相同用户已经登录 删除之前登录的session并关闭 + if (onlineUser.size() != 0){ + delSessionById(onlineUser.get(0).getId()); + } + + SESSIONS.put(session.getId(),session); + // 将用户添加到在线列表 + ONLINE_USERS.add(user); + + session.getAttributes().put(session.getId(),user); + session.getAttributes().put("sessionId",session.getId()); + + // 将连接id推送给前端 + session.sendMessage(new TextMessage(JsonUtils.toJson(Result.set(CodeEnum.SESSION_ID,session.getId(),null)))); + // 推送在线列表 + pushOnlineUser(); + // 推送公告 + pushNotice(session); + // 首次连接推送所有消息 + session.sendMessage(new TextMessage(JsonUtils.toJson(Result.set(CodeEnum.SERVER_TO,null,msgList)))); + } + + /** + * handleTextMessage: 处理接收到的文本消息。 + * @param session + * @param message 前端发送的消息 + * @throws Exception + */ + @Override + public void handleMessage(WebSocketSession session, WebSocketMessage message) throws Exception { + log.info("收到 WebSocket 消息:" + message.getPayload().toString()); + + Result result = JsonUtils.parse(message.getPayload().toString(),Result.class); + userMsg userMsg = JsonUtils.parse(result.getData().toString(), userMsg.class); + String username = userMsg.getUser().getUsername(); + long id = userMsg.getUser().getId(); + if (username == null || "".equals(username)){ + session.sendMessage(new TextMessage(JsonUtils.toJson(Result.error(CodeEnum.NOT_USERNAME)))); + } + String mtext = userMsg.getMessageInput(); + // 指令 清空消息 + if (mtext.substring(0,1).equals("$")){ + if (mtext.equals("$clear")&&id==1){ + msgList.removeAll(msgList); + broadcast(JsonUtils.toJson(Result.set(CodeEnum.SERVER_TO,null,msgList))); + return; + } + // 指令 发送公告 + if (mtext.substring(0,3).equals("$gg")&&id==1){ + notice.setTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"))); + notice.setGg(mtext.substring(3)); + broadcast(JsonUtils.toJson(Result.set(CodeEnum.NOTICE,null,notice))); + return; + } + } + + + // 普通消息 + Message msg = new Message(); + msg.setId(msgList.size()); + msg.setSender(username); + msg.setTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"))); + msg.setText(mtext); + // 广播消息给所有连接的客户端 + msgList.add(msg); + if (msgList.size()==60) + msgList.remove(0); + broadcast(JsonUtils.toJson(Result.set(CodeEnum.MESSAGE,session.getId(),msg))); + } + + + + @Override + public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { + log.info("WebSocket 连接错误:" + session.getId() + ", " + exception.getMessage()); + } + + @Override + public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { + log.info("WebSocket 连接已关闭:" + session.getId()); + // 移除session id与websocket连接的映射关系 + User user = (User) session.getAttributes().get(session.getId()); + ONLINE_USERS.remove(user); + String sessionId = (String) session.getAttributes().get("sessionId"); + if (sessionId != null) { + SESSIONS.remove(sessionId); + session.close(); + } + pushOnlineUser(); + } + + @Override + public boolean supportsPartialMessages() { + return false; + } + + private void broadcast(String message) throws IOException { + Set> entries = SESSIONS.entrySet(); + for (Map.Entry sessions : entries) { + if(sessions.getValue().isOpen()){ + sessions.getValue().sendMessage(new TextMessage(message)); + } + } + } + + // 推送在线列表 + private void pushOnlineUser() throws Exception{ + + broadcast(JsonUtils.toJson(Result.set(CodeEnum.ONLINE_USERS,null,ONLINE_USERS))); + } + // 推送公告 + private void pushNotice(WebSocketSession session) throws Exception{ + session.sendMessage(new TextMessage(JsonUtils.toJson + (Result.set(CodeEnum.NOTICE,null,notice)))); + } + private void delSessionById(long id) throws Exception{ + Set> entries = SESSIONS.entrySet(); + for (Map.Entry sessions : entries) { + User user = (User)sessions.getValue().getAttributes().get(sessions.getValue().getId()); + if (user.getId()==id){ + String sessionId = (String) sessions.getValue().getAttributes().get("sessionId"); + if (sessionId != null) { + SESSIONS.remove(sessionId); + sessions.getValue().close(); + } + } + } + } + +}