pom添加配置
bash
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
代码目录结构
WebsocketConfiguration
bash
package com.ruoyi.framework.socket.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebsocketConfiguration {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
System.out.println("(♥◠‿◠)ノ゙ WebSocket服务开启 ლ(´ڡ`ლ)゙");
return new ServerEndpointExporter();
}
}
bash
package com.ruoyi.framework.socket.ctrl;
import com.ruoyi.framework.socket.service.WebSocketService;
public class Distribute {
public static void send(WebSocketService webSocketService){
webSocketService.pushMsg();
}
}
bash
package com.ruoyi.framework.socket.ctrl;
import com.ruoyi.framework.socket.pojo.Message;
import com.ruoyi.framework.socket.service.WebSocketService;
/**
* 全部推送
*/
public class MultipleSending extends WebSocketService {
public MultipleSending(String msg){
Message message=new Message();
message.setPushClient("ALL");
message.setMessage(msg);
this.message=message;
}
@Override
public void send() {
this.sendAll(this.message.getMessage());
}
}
bash
package com.ruoyi.framework.socket.ctrl;
import com.ruoyi.framework.socket.pojo.Message;
import com.ruoyi.framework.socket.service.WebSocketService;
/**
* 单个发送
*/
public class SingleSending extends WebSocketService {
public SingleSending(Message message){
this.message=message;
}
@Override
public void send() {
this.sendToUser(this.message.getMessage(),this.message.getPushClient());
}
}
bash
package com.ruoyi.framework.socket.pojo;
import com.alibaba.fastjson.JSONObject;
public class Message {
private String messageType;
private String message;
private String pushClient;
public String getMessageType() {
return messageType;
}
public void setMessageType(String messageType) {
this.messageType = messageType;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public void setMessage(JSONObject message) {
this.message = message.toString();
}
public String getPushClient() {
return pushClient;
}
public void setPushClient(String pushClient) {
this.pushClient = pushClient;
}
public String toJson(){
return JSONObject.toJSONString(this);
}
}
bash
package com.ruoyi.framework.socket.service;
import com.ruoyi.framework.socket.pojo.Message;
import com.ruoyi.framework.socket.socketBase.WebSocketServer;
import com.ruoyi.framework.socket.utils.SocketException;
public abstract class WebSocketService extends WebSocketServer {
protected Message message;
//推送消息
public boolean pushMsg(){
try {
System.out.println("--------------------- check Data ----------------");
check();
System.out.println("--------------------- check Data end----------------");
System.out.println("--------------------- push Message----------------");
this.send();
System.out.println("--------------------- push Message end----------------");
return true;
}catch (SocketException socketException){
return false;
}catch (Throwable throwable){
return false;
}
}
private void check() throws SocketException {
this.checkItem(this.message.getMessageType());
this.checkItem(this.message.getMessage());
this.checkItem(this.message.getPushClient());
}
private void checkItem(String str) throws SocketException {
if (str==null||str.trim().isEmpty()){
throw new SocketException("关键数据不能为空");
}
}
public abstract void send();
}
bash
package com.ruoyi.framework.socket.socketBase;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.framework.socket.ctrl.SingleSending;
import com.ruoyi.framework.socket.pojo.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* socket端口
*/
@ServerEndpoint("/socket/{clientId}")
@Component
public class WebSocketServer {
private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);
/**
* 会话
*/
private static Map<String, Session> clients = new ConcurrentHashMap<>();
private static Map<Object, Object> clientsBak = new ConcurrentHashMap<>();
//接入
@OnOpen
public void onOpen(Session session, @PathParam("clientId") String clientId) {
log.info("【接入SOCKET】=====clientId====="+clientId+"======接入时间======"+ DateUtils.getTime());
//将新用户存入在线的组
clientsBak.put(session.getId(),clientId);
clients.put(clientId, session);
}
/**
* 离线
* @param session session
*/
@OnClose
public void onClose(Session session) {
System.out.println("【断开SOCKET】====="+session.getId()+"======date======"+DateUtils.getTime());
clients.remove(clientsBak.get(session.getId()));
clientsBak.remove(session.getId());
}
/**
* 发生错误
* @param throwable e
*/
@OnError
public void onError(Throwable throwable) {
throwable.printStackTrace();
}
/**
* 收到客户端发来消息
* @param message 消息对象
*/
@OnMessage
public void onMessage(String message,Session session) {
log.info("发送者:"+session.getId()+"报文--->"+message);
}
/**
* 消息广播
* @param message 消息内容
*/
public final void sendAll(String message) {
for (Map.Entry<String, Session> sessionEntry : clients.entrySet()) {
sessionEntry.getValue().getAsyncRemote().sendText(message);
}
}
//推送
public final void sendToUser(String msg,String id){
clients.get(id).getAsyncRemote().sendText(msg);
}
//在线人数
public final static int onLineSize(){
return clients.size();
}
/*
查看某个id是否在线
*/
public final static boolean onLine(String key){
return clients.containsKey(key);
}
}
package com.ruoyi.framework.socket.utils;
public class SocketException extends Exception{
public SocketException(){
super();
}
public SocketException(String message){
super(message);
}
public SocketException(String message, Throwable cause){
super(message,cause);
}
public SocketException(Throwable cause) {
super(cause);
}
}