添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
添加配置
package org.qx.websocket.config;
import org.lovely.common.core.text.Convert;
import org.lovely.common.core.utils.JwtUtils;
import org.lovely.common.core.utils.SpringUtils;
import org.lovely.module.websocket.constants.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.annotation.WebListener;
import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;
import static org.lovely.module.websocket.constants.Constants.WEBSOCKET_USER_KEY;
/**
* @author :ChenChao
* @date :Created in 2022/6/14 14:29
* @description:
*/
@WebListener
public class WebSocketSessionConfigurator extends ServerEndpointConfig.Configurator{
private final Logger logger = LoggerFactory.getLogger(WebSocketSessionConfigurator.class);
@Override
public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) {
try {
// String userKey = Convert.toStr(request.getParameterMap().get(WEBSOCKET_USER_KEY).get(0));
// String userId = JwtUtils.getUserId(userKey);
// logger.warn("userId:{}",userId);
// config.getUserProperties().put(Constants.WEBSOCKET_UID, userId);
}catch (Exception ex){
ex.printStackTrace();
}
}
}
业务处理
package org.qx.websocket.endpoint;
import com.alibaba.fastjson.JSONObject;
import org.lovely.common.core.text.Convert;
import org.lovely.common.core.utils.StringUtils;
import org.lovely.module.websocket.config.WebSocketSessionConfigurator;
import org.lovely.module.websocket.constants.Constants;
import org.lovely.module.websocket.domain.from.socket.MessageParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author :ChenChao
* @date :Created in 2022/6/14 14:28
* @description:普通 javax 的websocket
*/
@Component
@ServerEndpoint(value = "/jx_ws", configurator = WebSocketSessionConfigurator.class)
public class WebSocketServerEndpoint {
private final Logger logger = LoggerFactory.getLogger(WebSocketSessionConfigurator.class);
private static final Map<String, Session> users;
static {
users = new ConcurrentHashMap<String, Session>();
}
// 必须注入这个bean 否则 会 404
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
@OnOpen
public void onOpen(EndpointConfig conf, Session session) {
logger.info("连接成功");
String targetId = Convert.toStr(conf.getUserProperties().get(Constants.WEBSOCKET_UID));
if(StringUtils.hasText(targetId)) {
logger.info(targetId + "连接成功");
users.put(targetId, session);
} else {
try {
session.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 收到消息
* @param session
* @param message
*/
@OnMessage
public void handleMessage(Session session, String message) {
sendMessage(JSONObject.parseObject(message, MessageParam.class));
}
@OnError
public void error(Session session, java.lang.Throwable throwable) {
if (throwable.getMessage() != null) {
onClose(session);
}
}
@OnClose
public void onClose(Session session) {
try {
session.close();
String targetId = Convert.toStr(session.getUserProperties().get(Constants.WEBSOCKET_UID));
if (StringUtils.hasText(targetId)){
users.remove(targetId);
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 发送消息
* @param message
* @return
*/
public static boolean sendMessage(MessageParam message) {
Session session = users.get(message.getTargetId());
if (session == null) {
return false;
}
session.getAsyncRemote().sendText(JSONObject.toJSONString(message), new SendHandler() {
@Override
public void onResult(SendResult result) {
if (!result.isOK()) {
users.remove(message.getTargetId());
try {
session.close();
} catch (IOException e) {
}
}
}
});
return true;
}
}