master
jia 2024-03-27 14:16:31 +08:00
parent 598247f1c6
commit c4e73a0d43
5 changed files with 291 additions and 0 deletions

View File

@ -116,5 +116,6 @@
<artifactId>fastjson2</artifactId> <artifactId>fastjson2</artifactId>
<version>2.0.42</version> <version>2.0.42</version>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<String,WebSocketSession> SESSIONS = new ConcurrentHashMap<>();
// 在线用户列表
private static List<User> ONLINE_USERS = new ArrayList<>();
// 消息列表
private static List <Message> 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<User> 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<Map.Entry<String, WebSocketSession>> entries = SESSIONS.entrySet();
for (Map.Entry<String, WebSocketSession> 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<Map.Entry<String, WebSocketSession>> entries = SESSIONS.entrySet();
for (Map.Entry<String, WebSocketSession> 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();
}
}
}
}
}