专栏首页Java开发者之家springboot整合篇-springboot整合websocket

springboot整合篇-springboot整合websocket

# springboot整合websocket

springboot整合websocket分为两种常见的整合方式:

第一种,使用@ServerEndpoint接口来实现。

第二种,使用@EnableWebSocket配合WsHandler方法进行。

# ServerEndpoint方式实现

# ServerEndpoint方式配置文件

@Configuration
public class WebSocketConfiguration {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

# ServerEndpoint方式的实现

ServerEndpoint的实现主要针对业务领域对websocket消息进行处理,主要使用@OnOpen对websocket连接建立时需要实现的逻辑,@OnClose对websocket连接关闭时需要实现的逻辑,@OnMessage对websocket收到消息时的处理以及@OnError对websocket发生错误时的处理方式。

@ServerEndpoint(value = "/websocket")
@Component
public class WebsocketServer {
    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;

    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
    private static CopyOnWriteArraySet<WebsocketServer> webSocketSet = new CopyOnWriteArraySet<WebsocketServer>();

    private static ConcurrentHashMap<Session, WebsocketServer> websocketMap = new ConcurrentHashMap<>();

    //与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;

    private Session id;

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        webSocketSet.add(this);     //加入set中
        addOnlineCount();           //在线数加1
        this.id = session;
        websocketMap.put(session, this);

        try {
            sendMessage("当前有连接进入," + getOnlineCount());
        } catch (IOException e) {
            System.out.println("IO异常");
        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(Session session) {
        subOnlineCount();           //在线数减1
        webSocketSet.remove(this);  //从set中删除
        websocketMap.remove(session);
        System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
    }

    /**
     * 收到客户端消息后调用的方法
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("来自客户端的消息:" + message);
        try {
            sendMessageToUser(message, session);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("发生错误");
        error.printStackTrace();
    }

    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
        //this.session.getAsyncRemote().sendText(message);
    }

    public void sendMessageToUser(String message, Session session) throws IOException {
        if (websocketMap.get(session) != null) {
            if(!id.equals(session)) {
                websocketMap.get(session).sendMessage("用户" + session.getId() + "发来消息:" + message);
            } else {
                websocketMap.get(session).sendMessage("用户" + session.getId() + "发来消息:" + message);
            }
        } else {
            //如果用户不在线则返回不在线信息给自己
            sendMessageToUser("当前用户不在线",id);
        }
    }

    /**
     * 群发消息
     * @param message
     */
    public void sendMessageToAll(String message) {
        for (WebsocketServer item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 群发自定义消息
     * */
    public static void sendInfo(String message) throws IOException {
        for (WebsocketServer item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                continue;
            }
        }
    }

    public static synchronized int getOnlineCount() {
        return onlineCount;
    }

    public static synchronized void addOnlineCount() {
        WebsocketServer.onlineCount++;
    }

    public static synchronized void subOnlineCount() {
        WebsocketServer.onlineCount--;
    }
}

# EnableWebSocket方式实现

# EnableWebSocket方式的配置文件

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
        webSocketHandlerRegistry.addHandler(webSocketHandler(), "websocket")
                .setAllowedOrigins("*");
    }

    public WebSocketHandler webSocketHandler() {
        return new WsHandler();
    }
}

# EnableWebSocket方式的实现

@EnableWebSocket主要是通过继承TextWebSocketHandler来实现对websocket消息的处理。

public class WsHandler extends TextWebSocketHandler {
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        // 获取接收到的数据
        String payload = message.getPayload();
        System.out.println("收到客户端消息:" + message.getPayload());

        // 向客户端发送数据
        session.sendMessage(new TextMessage("response: " + payload));
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        System.out.println("有连接加入");
        super.afterConnectionEstablished(session);
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        System.out.println("有连接关闭");
        super.afterConnectionClosed(session, status);
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringBoot整合webSocket

    小伙伴们,周一快乐。悄悄告诉大家一个好消息,还有四天就放假了。。惊不惊喜 意不意外

    猿码优创
  • SpringBoot整合websocket

    WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

    用户3467126
  • springboot整合篇-springboot整合log4j2

    log4j2设计之初是为了审计,log4j2是log4j 1.x 的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升。

    Java开发者之家
  • springboot vue整合websocket

    似水的流年
  • springboot vue整合websocket

    compile 'org.springframework.boot:spring-boot-starter-websocket'

    似水的流年
  • springboot整合websocket(1)

      我们都知道http协议只能浏览器单方面向服务器发起请求获得响应,服务器不能主动向浏览器推送消息。想要实现浏览器的主动推送有两种主流实现方式:

    用户2038589
  • springboot整合websocket技术

    简单来说就是一个基于TCP的持久化的网络通信协议。主要作用就是:服务端可以主动推送信息给客户端,不需要客户端重复的向服务端发请求查询。

    海加尔金鹰
  • SpringBoot之SpringBoot整合Mybatis SpringBoot之SpringBoot整合JdbcTemplate

    记得添加数据库的驱动,上一章整合JdbcTemplate的时候已经添加过了,忘记的可以看一下《SpringBoot之SpringBoot整合JdbcTempla...

    彼岸舞
  • Springboot整合Websocket遇到的坑

    如果客户端关闭了websocket,但服务端没有监听到关闭事件,即onClose方法没有调用,这是会发生的情况

    用户2409797
  • SpringBoot整合整合jsp、整合freemarker、整合Thymeleaf

    1、SpringBoot整合整合jsp、整合freemarker、整合Thymeleaf。

    别先生
  • SpringBoot整合

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而...

    青衫染红尘
  • SpringBoot整合

    崔笑颜
  • 【springboot】 springboot 整合mybatis-plus

    springboot整和mybatis-plus 整合步骤 1.pom.xml 添加mp依赖 <!-- mybatis-plus begin --> <depe...

    冷冷
  • SpringBoot之SpringBoot整合log4j

    在默认的情况下,SpringBoot自动整合了最简单的logback,那么要想使用log4j就要先排除默认的日志框架,然后添加log4j场景启动器

    彼岸舞
  • SpringBoot之SpringBoot整合logback

      logback的依赖不需要单独添加,在添加web场景启动器的时候已经通过依赖传递,导入了

    彼岸舞
  • SpringBoot之SpringBoot整合JdbcTemplate

    添加jdbc场景启动器,及其Mysql的驱动,Mysql的驱动版本根据自己的情况定

    彼岸舞
  • SpringBoot之SpringBoot整合lombok

    lombok是IDEA中的一个插件,需要手动安装,为什么要用呢?是因为它可以大大简化模型的代码,在打包编译时自动生成,去除掉模型中的get方法set方法无参构造...

    彼岸舞
  • springboot整合websocket实现消息推送

    似水的流年
  • springboot整合websocket实现消息推送

    似水的流年

扫码关注云+社区

领取腾讯云代金券