springboot整合websocket该怎么配置?websocket是什么?

TheDisguiser 2020-07-16 10:32:00 java常见问答 7888

websocket对java刚入门的小伙伴来说可能有点陌生,今天我们就来讲讲websocket该如何整合在springboot中及它的基本概念。

一、websocket是什么?

一种基于TCP的网络协议,如果实现了它,服务器就能够主动发送消息给客户端,客户端也能够给服务器发送消息。在HTTP协议中,通讯只能是由客户端发起,所以以前获取消息时,是在前端采用轮询方式向后端请求获取数据获取的,这样效率极低,且极易浪费资源,由此,WebSocket诞生。

二、springboot整合websocket

maven依赖导入

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-websocket</artifactId>
     <version>2.2.0.RELEASE</version>
</dependency>

配置 WebSocketConfig

package com.ruhaunxingyun.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
 * @description: 开启WebSocket
 * @author: ruphie
 * @date: Create in 2020/6/15 12:11
 * @company: ruhuanxingyun
 */
@Configuration
public class WebSocketConfig
{
    @Bean
    public ServerEndpointExporter serverEndpointExporter()
    {
        return new ServerEndpointExporter();
    }
}

核心类WebSocketServer编写

package com.ruhuanxingyun.websocket;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * @description: 发送与接收消息
 * @author: ruphie
 * @date: Create in 2020/6/15 13:24
 * @company: ruhuanxingyun
 */
@Component
@ServerEndpoint("/ws/ruhuanxingyun/{userId}")
@Slf4j
public class WebSocketServer
{
    private static AtomicInteger onlineNum = new AtomicInteger();
    private static Map < Long, Session > map = new ConcurrentHashMap < > ();
    /**
     * 建立连接
     *
     * @param session session
     * @param userId  用户ID
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId)
    {
        int num = onlineNum.incrementAndGet();
        map.put(Long.valueOf(userId), session);
        log.info("新建立客户端连接,sessionId为:{},当前连接数为:{}", session.getId(), num);
    }
    /**
     * 关闭连接
     *
     * @param session session
     */
    @OnClose
    public void onClose(Session session)
    {
        map.values()
            .remove(session);
        int num = onlineNum.decrementAndGet();
        log.info("sessionId为{}的客户端连接关闭,当前剩余连接数为:{}", session.getId(), num);
    }
    /**
     * 客户端发送消息
     *
     * @param session session
     * @param message 消息
     */
    @OnMessage
    public void onMessage(Session session, String message)
    {
        log.info("sessionId : {} , onMessage : {}", session.getId(), message);
    }
    /**
     * 发生错误
     */
    @OnError
    public void onError(Session session, Throwable error)
    {
        log.error("WebSocket发生错误:{},Session ID: {}", error, session.getId());
    }
    /**
     * 服务器端推送消息
     *
     * @param session session
     * @param message 消息
     */
    public static void sendMessage(Session session, String message)
    {
        try
        {
            if (session.isOpen())
            {
                // 同步消息
                session.getBasicRemote()
                    .sendText(message);
                // 异步消息
                //session.getAsyncRemote().sendText(message);
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
            log.error("WebSocket发送消息出错:{}", e.getMessage());
        }
    }
}

以上就是关于springboot整合websocket的所有内容,还想知道更多java项目中常见问题解决方法及答案请一定记得关注奇Q工具网了解详情。

推荐阅读:

springboot书籍推荐,springboot书籍排行解析

springboot整合quartz要如何实现?需要哪些依赖?

springboot打war包部署如何配置?