spring websocket 配置

网盘源码资源:链接: https://pan.baidu.com/s/1mMhiJUASo2T2id4l3cThnw 密码: c28u

配置步骤:

1、WebSocketConfig.java
@Configuration
@ComponentScan(basePackages = {"xxx.xxx.xxx"})
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
    @Resource
    MyWebSocketHandler handler;

    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {

        registry.addHandler(handler, "/xxxx/ws.json").addInterceptors(new HandShake()).setAllowedOrigins("*");

        registry.addHandler(handler, "/xxxx/ws/sockjs").addInterceptors(new HandShake()).setAllowedOrigins("*").withSockJS();

    }

}

2、HandShake.java

public class HandShake implements HandshakeInterceptor {
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
        ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
        ServletServerHttpResponse httpServletResponse = (ServletServerHttpResponse) response;
        HttpSession session = servletRequest.getServletRequest().getSession(false);
        // 标记用户
        String xxx= (String) servletRequest.getServletRequest().getParameter("xxx");
        System.out.println("拦截到请求:xxx" + xxx);
        HttpServletResponse response1 = httpServletResponse.getServletResponse();
        response1.addHeader("Access-Control-Allow-Origin", "*");
        CookieUtil.setCookie(response1, "token", xxx);
        attributes.put("xxx", xxx);
        return true;
    }

    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
    }

}

3、MyWebSocketHandler.java

@Component
public class MyWebSocketHandler implements WebSocketHandler {
    public static final Map<String, WebSocketSession> userSocketSessionMap;
    private Logger logger = Logger.getLogger(this.getClass());

    static {
        userSocketSessionMap = new HashMap<String, WebSocketSession>();
    }

    /**
     * 建立连接后
     */
    public void afterConnectionEstablished(WebSocketSession session)
            throws Exception {
        String uid = (String) session.getAttributes().get("xxx");
        logger.warn("接收到前台消息:" + uid);
        userSocketSessionMap.put(uid, session);

    }

    /**
     * 消息处理,在客户端通过Websocket API发送的消息会经过这里,然后进行相应的处理
     */
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
        String xxx= (String) session.getAttributes().get("xxx");
        logger.warn("接收到前台消息" + message.toString() + ",xxx:" + xxx);
        session.sendMessage(new TextMessage(new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create().toJson(message)));

    }

    /**
     * 消息传输错误处理
     */
    public void handleTransportError(WebSocketSession session,
                                     Throwable exception) throws Exception {
        if (session.isOpen()) {
            session.close();
        }

    }

    /**
     * 关闭连接后
     */
    public void afterConnectionClosed(WebSocketSession session,
                                      CloseStatus closeStatus) throws Exception {
        String xxx= (String) session.getAttributes().get("xxx");
        System.out.println("Websocket:" + xxx+ "已经关闭");
        Iterator<Map.Entry<String, WebSocketSession>> it = userSocketSessionMap
                .entrySet().iterator();
        // 移除Socket会话
        while (it.hasNext()) {
            Map.Entry<String, WebSocketSession> entry = it.next();
            if (entry.getValue().getId().equals(xxx)) {
                userSocketSessionMap.remove(entry.getKey());
                System.out.println("Socket会话已经移除:用户ID" + entry.getKey());
                break;
            }
        }
    }

    public boolean supportsPartialMessages() {
        return false;
    }

    /**
     * 给所有在线用户发送消息
     *
     * @param message
     * @throws IOException
     */
    public void broadcast(final TextMessage message) throws IOException {
        Iterator<Map.Entry<String, WebSocketSession>> it = userSocketSessionMap
                .entrySet().iterator();

        // 多线程群发
        while (it.hasNext()) {

            final Map.Entry<String, WebSocketSession> entry = it.next();

            if (entry.getValue().isOpen()) {
                // entry.getValue().sendMessage(message);
                new Thread(new Runnable() {

                    public void run() {
                        try {
                            if (entry.getValue().isOpen()) {
                                entry.getValue().sendMessage(message);
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

                }).start();
            }

        }
    }

    /**
     * 给某个用户发送消息
     *
     * @param
     * @param message
     * @throws IOException
     */
    public void sendMessageToUser(String xxx, TextMessage message)
            throws IOException {
        WebSocketSession session = userSocketSessionMap.get(xxx);
        if (session != null && session.isOpen()) {
            session.sendMessage(message);
            logger.warn("给用户:" + xxx+ "发送消息:" + message.toString());
        }else{
            logger.warn("给用户:" + xxx+ "发送消息:" + message.toString()+"但是session失效");

        }
    }
}

4、Message.java

public class Message {
    //发送者
    public Long from;
    //发送者名称
    public String fromName;
    //接收者
    public Long to;
    //发送的文本
    public String text;
    //发送日期
    public Date date;

    public Long getFrom() {
        return from;
    }

    public void setFrom(Long from) {
        this.from = from;
    }

    public String getFromName() {
        return fromName;
    }

    public void setFromName(String fromName) {
        this.fromName = fromName;
    }

    public Long getTo() {
        return to;
    }

    public void setTo(Long to) {
        this.to = to;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值