package com.ruoyi.framework.websocket;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.Semaphore;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.information.domain.QcStudent;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* websocket 消息处理
*
* @author ruoyi
*/
@Component
@ServerEndpoint("/websocket/message")
@Slf4j
public class WebSocketServer
{
/**
* WebSocketServer 日志控制器
*/
private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketServer.class);
/**
* 默认最多允许同时在线人数100
*/
public static int socketMaxOnlineCount = 100;
private static CopyOnWriteArraySet<WebSocketServer> webSockets = new CopyOnWriteArraySet<>();
private static Semaphore socketSemaphore = new Semaphore(socketMaxOnlineCount);
private Session session;
/**
* 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session) throws Exception
{
this.session = session;
webSockets.add(this);
log.info("连接成功");
}
/**
* 连接关闭时处理
*/
@OnClose
public void onClose(Session session)
{
LOGGER.info("\n 关闭连接 - {}", session);
}
/**
* 抛出异常时处理
*/
@OnError
public void onError(Session session, Throwable exception) throws Exception
{
if (session.isOpen())
{
// 关闭连接
session.close();
}
String sessionId = session.getId();
LOGGER.info("\n 连接异常 - {}", sessionId);
LOGGER.info("\n 异常信息 - {}", exception);
}
/**
* 服务器接收到客户端消息时调用的方法
*/
@OnMessage
public void onMessage(String message, Session session) throws IOException {
log.info("接收到的消息-->"+message);
String msg = message.replace("你", "我").replace("吗", "");
QcStudent qcStudent = new QcStudent();
qcStudent.setName("cq");
qcStudent.setAge(18L);
qcStudent.setTelphone("188888888888");
String string = JSON.toJSONString(qcStudent);
session.getBasicRemote().sendText(string);
}
/**
* 发送文本消息
* @param message 消息内容
*/
public void sendMessageText(String message)
{
for (WebSocketServer webSocket : webSockets) {
if (webSocket.session.isOpen()){
try
{
webSocket.session.getBasicRemote().sendText(message);
}
catch (IOException e)
{
LOGGER.error("\n[发送消息异常]", e);
}
}
}
}
}
记得一定要加上这个,踩了好久的坑,之前前端一直连接不上后端
作用:
ServerEndpointExporter
是 WebSocket 的核心组件之一,它的作用是自动注册带有@ServerEndpoint
注解的 WebSocket 服务端点。- 当 Spring 容器启动时,
serverEndpointExporter
会被调用,它会自动将 WebSocket 服务端点(如@ServerEndpoint
标注的类)注册到 WebSocket 容器中。
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}