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