项目总结48:springboot集成websocket案例(代码片段)

wobuchifanqie wobuchifanqie     2023-05-04     447

关键词:

项目总结48:Springboot集成Websocket案例

 

Springboot集成Websocket的具体实现由很多方式,但原理是一样的;

先放一个具体的案例

  pom.xml jar依赖

        <!-- websocket -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

   服务端发送消息

package com.hs.web.thirdparty.webconnect;

import com.hs.common.util.json.JsonUtil;

import java.util.ArrayList;
import java.util.List;


public class WebConnectionManager 

    private static WebConnectionManager instance = new WebConnectionManager();

    private List<UpdateListener> changeListenerList;

    private WebConnectionManager() 
        changeListenerList = new ArrayList<UpdateListener>();
    

    public static WebConnectionManager getInstance() 
        return instance;
    

    public void addChangeListener(UpdateListener changeListener) 
        synchronized (changeListenerList) 
            changeListenerList.add(changeListener);
        
    
    
    public void removeChangeListener(UpdateListener changeListener) 
        synchronized (changeListenerList) 
            for (UpdateListener listener : changeListenerList) 
                if (listener.getUid().equals(changeListener.getUid())) 
                    changeListenerList.remove(listener);
                    break;
                
            
        
    

    public void sendMessage(String message) 
        synchronized (changeListenerList) 
            for (UpdateListener listener : changeListenerList) 
                listener.updateHandle(message);
            
        
    
    
    public void sendMessage(Object obj) 
        //System.out.println("JsonUtil.toJson(obj): " +JsonUtil.toJson(obj));
        sendMessage(JsonUtil.toJson(obj));
    

    private String getMessage() 
        return null;
    
    
    public static void main(String[] args) 
    
    

   客户端请求入口

package com.hs.web.thirdparty.webconnect;
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.logging.Logger;

@ServerEndpoint(value = "/monitor")
@Component
public class WebSocketServer 
    
    private Session targetSession;
    private UpdateListener changeListener;
    private static final Logger sysLogger = Logger.getLogger("sysLog");

    /**
     *@Description:链接建立成功时调用的方法
     *@param
     *@return  void
     *@author  TangYujie
     *@date  2019/12/12 17:11
     */
    @OnOpen
    public void open(Session session) 
        this.targetSession = session;
        
        changeListener = new UpdateListener() 
            
            @Override
            public String getUid() 
                return targetSession.getId();
            
            
            @Override
            public void updateHandle(String message) 
                sendMessage(message);
            
        ;
        
        WebConnectionManager.getInstance().addChangeListener(changeListener);
        sysLogger.info("*** WebSocket opened from sessionId " + targetSession.getId());
    

    /**
     *@Description:收到客户端消息
     *@param
     *@return  void
     *@author  TangYujie
     *@date  2019/12/12 17:13
     */
    @OnMessage
    public void inMessage(String message) 

    

    /**
     *@Description: 连接关闭
     *@param
     *@return  void
     *@author  TangYujie
     *@date  2019/12/12 17:15
     */
    @OnClose
    public void end() 
        WebConnectionManager.getInstance().removeChangeListener(changeListener);
        sysLogger.info("*** WebSocket closed from sessionId " + this.targetSession.getId());
    
    
    private synchronized void sendMessage(String message)
        try 
            targetSession.getBasicRemote().sendText(message);
         catch (IOException e) 
            sysLogger.warning(e.getMessage());
         catch(IllegalStateException e)
            sysLogger.warning(e.getMessage());
        
    
    

  监听接口类:一个接口类,定义了updateHandle(数据库处理)和getUid(获取Uid)两个方法

package com.hs.web.thirdparty.webconnect;

public interface UpdateListener 
    
    void updateHandle(String message);
    
    String getUid();

  服务端发送消息

    public static void main(String[] args) 
        String data = "this is a test message";
        WebConnectionManager.getInstance().sendMessage(data);
    

 

 

分析说明:

  1-当客户端通过ws://ip:port/monitor连接socket时,根据@ServerEndpoint(value = "/monitor")注解;执行WebSocketServer 标有@OnOpen的open方法,即建立一个连接;

  2-open方法中会实现一个UpdateListener 接口类,并将该实现加入到WebConnectionManager 中的List<UpdateListener> changeListenerList中;而UpdateListener 接口类中的updateHandle实现了targetSession.getBasicRemote().sendText(message);即服务端的消息推送;

  3-当服务端通过WebConnectionManager.getInstance().sendMessage(data)发送消息时,会遍历List<UpdateListener> changeListenerList,执行其中的updateHandle方法,从而进行消息推送;

项目总结52:linux安装mongodb和springboot集成mongodb(代码片段)

项目总结52:Linux安装mongodb和Springboot集成mongodb Linux安装mongodb 如何在Linux上安装mongodb,可以参考这篇文章:https://blog.csdn.net/E_Eric12138/article/details/89606950Springboot集成mongodb第一步:POM文件中引入jar包<dependency><groupId>o... 查看详情

springboot

  一、SpringBoot所解决的问题  Java开发十分笨重:繁多的配置、低下的开发效率、复杂的部署流程以头疼的第三方技术集成。  SpringBoot的理念:习惯优于配置——项目中存在大量的配置,此外还内置一个习惯性配置,免除... 查看详情

springboot集成mybatis通用mapper使用总结

 springboot集成MyBatis通用Mapper使用总结2019年  参考资料:Springboot集成MyBatis通用MapperSpringBoot框架之通用mapper插件(tk.mybatis)springboot如何优雅的使用mybatis-spring-boot-starter三分钟让你看懂Springboot中Mybatis的使用SpringB 查看详情

rocketmq集成springboot(代码片段)

RocketMQRocketMQ集成SpringBoot1.项目配置1.1新建项目1.2引入依赖2.生产者实现3.消费者实现总结RocketMQ集成SpringBoot1.项目配置1.1新建项目新建两个SpringBoot项目,项目名分别为:springboot-rocketmq-consumer、springboot-rocketmq-producter;1... 查看详情

rocketmq集成springboot(代码片段)

RocketMQRocketMQ集成SpringBoot1.项目配置1.1新建项目1.2引入依赖2.生产者实现3.消费者实现总结RocketMQ集成SpringBoot1.项目配置1.1新建项目新建两个SpringBoot项目,项目名分别为:springboot-rocketmq-consumer、springboot-rocketmq-producter;1... 查看详情

elasticsearch_08_springboot集成es(代码片段)

...1阶段一(直接查询)2.1.1直接调用es的接口插入文档2.1.2使用springboot接口插入文档2.1.3使用springboot接口删除文档2.2阶段二(添加上分组)2.3阶段三总结前言一、新建项目选择springboot项目,这里可以选择custom表示自定义,然后输... 查看详情

springboot集成kafka

参考技术A最近陆续收到不少朋友反馈,他们在计划要在springboot项目引入kafka中间件。在网上找过很多资料,但都比较零散,按照其说明进行操作后让项目正常跑起来仍是比较坎坷,听说我对kafka比较了解,希望给予一起分享。刚... 查看详情

springboot总结(代码片段)

目录一,什么是SpringBoot二,作用/好处优点约定大于配置三,配置文件1.properties格式2.yml格式3.读取配置4.propertiesVSyml总结四,日志文件1.什么是日志2.作用3.日志级别4.日志的输出及打印一,什么是SpringBootSpring的... 查看详情

精通系列springboot集成elasticsearch+项目实战(代码片段)

Java之ElasticSearch7.x.x+SpringBoot+爬虫+项目实战【一篇文章精通系列】【SpringBoot集成ElasticSearch+项目实战】一、ElasticSearch的Java官方文档1、查看官方文档2、找到了原生的依赖3、初始化二、创建SpringBoot项目1、创建项目2、... 查看详情

springboot入门到精通-springboot集成ssm开发项目(代码片段)

SpringBoot入门到精通系列SpringBoot入门到精通-Spring的注解编程(一)SpringBoot入门到精通-SpringBoot入门(二)SpringBoot入门到精通-Spring的基本使用(三)SpringBoot入门到精通-SpringBoot集成SSM(四)前言上一篇文章我们讲的是SpringBoot的基本用法,... 查看详情

springboot项目各组件集成(代码片段)

swagger-bootstrap-ui https://blog.csdn.net/u010192145/article/details/79216037springboot多数据源项目demoConfigurationProperties+tkmapper+druidhttps://www.cnblogs.com/nightOfStreet/p/11543768.htmlvim复制+ 查看详情

springboot项目如何集成jsp

教程地址:https://www.ixigua.com/7110488023300571681?logTag=ae997b24cee15b4df45f 查看详情

springboot项目如何集成jsp

教程地址:https://www.ixigua.com/7110488023300571681?logTag=ae997b24cee15b4df45f 查看详情

springboot项目如何集成jsp

教程地址:https://www.ixigua.com/7110488023300571681?logTag=ae997b24cee15b4df45f 查看详情

springboot集成积木报表

搭建SpringBoot项目idea中选择File-New-Project选择SpringInitializr、选择对应的JDK版本、点击Next输入项目名称,包名等点击Next跳过选择默认依赖这一步,直接Next选择项目存放路径,然后点击Finish至此SpringBoot项目创建结束。2.配置Maven依赖... 查看详情

springboot项目集成redis详解

参考技术A遵循我们springboot开发三板斧这里我们使自己的redis配置类,里面已经对默认的序列化方式做了修改可以直接用于工作使用指定我们写好的redisTemplate即可,一把工作中redis的api会封装成工具类使用到这里,我们就可以在... 查看详情

两年摸爬滚打springboot,总结了这16条最佳实践(代码片段)

SpringBoot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用SpringBoot所采用的最佳实践。这些内容是基于我的个人经验和一些熟知的SpringBoot专家的文章。在本文中,我将重点介绍SpringB... 查看详情

两年摸爬滚打springboot,总结了这16条最佳实践(代码片段)

SpringBoot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用SpringBoot所采用的最佳实践。这些内容是基于我的个人经验和一些熟知的SpringBoot专家的文章。在本文中,我将重点介绍SpringB... 查看详情