javax.websocket 在spring-boot中的使用教程

添加依赖

<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;
    }
}

 

posted @ 2022-06-14 19:40  浅笑19  阅读(696)  评论(0编辑  收藏  举报