diff --git a/dl_admin/ruoyi-admin/pom.xml b/dl_admin/ruoyi-admin/pom.xml
index 2648350..6f72e83 100644
--- a/dl_admin/ruoyi-admin/pom.xml
+++ b/dl_admin/ruoyi-admin/pom.xml
@@ -128,6 +128,11 @@
org.apache.httpcomponents
httpclient
+
+ org.springframework
+ spring-websocket
+ 5.3.31
+
diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/Message.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/Message.java
new file mode 100644
index 0000000..c0dcd25
--- /dev/null
+++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/Message.java
@@ -0,0 +1,14 @@
+package com.ruoyi.webSocket;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class Message {
+ private Integer id;
+ private String username;
+ private String userface;
+ private String text;
+ private Date date;
+}
diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/MessageUtil.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/MessageUtil.java
new file mode 100644
index 0000000..036e7a5
--- /dev/null
+++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/MessageUtil.java
@@ -0,0 +1,26 @@
+package com.ruoyi.webSocket;
+
+import java.util.Date;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class MessageUtil {
+
+// private static List messageList = new CopyOnWriteArrayList<>();
+ private static AtomicInteger atomicInteger = new AtomicInteger(0);
+
+ public Message toMessage(String content){
+ Message message = new Message();
+ int id = atomicInteger.incrementAndGet();
+ message.setId(id);
+ String[] contents=content.split(",");
+ String name=contents[0];
+ String userface=contents[1];
+ String text=contents[2];
+ message.setUsername(name);
+ message.setUserface(userface);
+ message.setText(text);
+ message.setDate(new Date());
+
+ return message;
+ }
+}
diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/ServerEncoder.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/ServerEncoder.java
new file mode 100644
index 0000000..1fe7f78
--- /dev/null
+++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/ServerEncoder.java
@@ -0,0 +1,53 @@
+package com.ruoyi.webSocket;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import javax.websocket.EncodeException;
+import javax.websocket.Encoder;
+import javax.websocket.EndpointConfig;
+import java.io.StringWriter;
+
+
+/**
+ * Encoder which encodes the object data into messages
+ * which can be transported over the websocket connection.
+ */
+
+public class ServerEncoder implements Encoder.Text {
+
+ /**
+ * Encode the instance of MyMessage into a JSON string.
+ */
+ @Override
+ public String encode(Message msg) throws EncodeException {
+ StringWriter writer = new StringWriter();
+ //Makes use of the JSON Streaming API to build the JSON string.
+// JSON.createGenerator(writer)
+// .writeStartObject()
+// .write("message", myMsg.message)
+// .write("time", myMsg.receivedAt.toString())
+// .writeEnd()
+// .flush();
+ ObjectMapper om =new ObjectMapper();
+ try {
+ writer.write(om.writeValueAsString(msg));
+ System.out.println(writer.toString());
+ writer.flush();
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ }
+
+ return writer.toString();
+ }
+
+ @Override
+ public void init(EndpointConfig config) {
+
+ }
+
+ @Override
+ public void destroy() {
+ }
+
+}
diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/WebSocketConfig.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/WebSocketConfig.java
new file mode 100644
index 0000000..5f615fa
--- /dev/null
+++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/WebSocketConfig.java
@@ -0,0 +1,14 @@
+package com.ruoyi.webSocket;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+@Configuration
+public class WebSocketConfig {
+
+ @Bean
+ public ServerEndpointExporter serverEndpointExporter() {
+ return new ServerEndpointExporter();
+ }
+}
\ No newline at end of file
diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/WebSocketServer.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/WebSocketServer.java
new file mode 100644
index 0000000..aa07be7
--- /dev/null
+++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/WebSocketServer.java
@@ -0,0 +1,117 @@
+package com.ruoyi.webSocket;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.OnClose;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @Date: 2019/1/11 11:48
+ * @Description: websocket 服务类
+ */
+
+/**
+ *
+ * @ServerEndpoint 这个注解有什么作用?
+ *
+ * 这个注解用于标识作用在类上,它的主要功能是把当前类标识成一个WebSocket的服务端
+ * 注解的值用户客户端连接访问的URL地址
+ *
+ */
+
+@Slf4j
+@Component
+@ServerEndpoint(value = "/ws/asset/{name}",
+ encoders = {ServerEncoder.class})
+public class WebSocketServer {
+
+ /**
+ * 与某个客户端的连接对话,需要通过它来给客户端发送消息
+ */
+ private Session session;
+
+ /**
+ * 标识当前连接客户端的用户名
+ */
+ private String name;
+
+ /**
+ * 用于存所有的连接服务的客户端,这个对象存储是安全的
+ */
+ private static ConcurrentHashMap webSocketSet = new ConcurrentHashMap<>();
+
+
+ @OnOpen
+ public void OnOpen(Session session, @PathParam(value = "name") String name){
+ this.session = session;
+ this.name = name;
+ // name是用来表示唯一客户端,如果需要指定发送,需要指定发送通过name来区分
+ webSocketSet.put(name,this);
+ CountPerson("C,"+String.valueOf(webSocketSet.size()));
+ log.info(name+"连接成功,当前连接人数为:={}",webSocketSet.size());
+ }
+ @OnClose
+ public void OnClose(){
+ webSocketSet.remove(this.name);
+ CountPerson(String.valueOf(webSocketSet.size()));
+ log.info(name+"退出成功,当前连接人数为:={}",webSocketSet.size());
+ }
+
+ @OnMessage
+ public void OnMessage(String message){
+// log.info("[WebSocket] 收到消息:{}",message.split(",")[2]);
+ //判断是否需要指定发送,具体规则自定义
+ if(message.indexOf("TOUSER") == 0){
+ String name = message.substring(message.indexOf("TOUSER")+6,message.indexOf(";"));
+ System.out.println(name);
+ AppointSending(name,message.substring(message.indexOf(";")+1,message.length()));
+ }else{
+ GroupSending(message);
+ }
+
+ }
+
+ /**
+ * 群发
+ * @param message
+ */
+ public void GroupSending(String message){
+ for (String name : webSocketSet.keySet()){
+ try {
+ MessageUtil messageUtil=new MessageUtil();
+ Message msg=messageUtil.toMessage(message);
+ webSocketSet.get(name).session.getBasicRemote().sendObject(msg);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+ }
+ public void CountPerson(String count){
+ for (String name : webSocketSet.keySet()){
+ try {
+ webSocketSet.get(name).session.getBasicRemote().sendText(count);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * 指定发送
+ * @param name
+ * @param message
+ */
+ public void AppointSending(String name,String message){
+ try {
+ webSocketSet.get(name).session.getBasicRemote().sendText(message);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file