springboot 集成 websocket

Posted monkay

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot 集成 websocket相关的知识,希望对你有一定的参考价值。

1.介绍

WebSocket是html5新增的协议,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道。实时推送数据/通知到浏览器

方法一

  1. 引入WebSocket依赖包
    ````xml

    org.springframework.boot
    spring-boot-starter-websocket


    org.springframework.boot
    spring-boot-starter-webflux

  2. 编写 WebSocket 实现方法

    @ServerEndpoint(value = "/websocket/id")
    @Component
    public class WebSocketServer 
    
        /**
         * 静态常量,记录连接个数,线程安全
         */
        private static int onlineCount = 0;
    
        /**
         * 存放客户端对应的WebSocket对象
         */
        private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
    
        /**
         * 会话信息
         */
        private Session session;
    
        @OnOpen
        public void onOpen(Session session)
            this.session = session;
            webSocketSet.add(this);
            addOnlineCount();
            try 
                sendMessage("连接成功");
            catch (IOException ex)
                System.out.println(ex.getMessage());
            
        
    
        @OnMessage
        public void onMessage(String message, Session session, @PathParam("id")String id)
            System.out.println("来自客户端的消息:" + message);
    
            //群发消息
            for (WebSocketServer item : webSocketSet) 
                try 
                    item.sendMessage(message);
                 catch (IOException e) 
                    e.printStackTrace();
                
            
        
    
        @OnClose
        public void onClass()
            webSocketSet.remove(this);
            subOnlineCount();
            System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
        
    
        @OnError
        public void onError(Session session,Exception ex)
            ex.printStackTrace();
        
    
        /**
         * 发送消息
         * @param message
         * @throws IOException
         */
        private void sendMessage(String message) throws IOException 
            this.session.getBasicRemote().sendText(message);
        
    
        private void sendInfo(String message)
            System.out.println(message );
            for (WebSocketServer item:webSocketSet ) 
    
                try
                    item.sendMessage(message);
                catch (IOException ex)
                    System.out.println(ex.getMessage());
    
                
            
        
    
        private synchronized void addOnlineCount()
            WebSocketServer.onlineCount ++;
        
    
        private synchronized void subOnlineCount()
            WebSocketServer.onlineCount --;
        
    
        public static synchronized long getOnlineCount()
            return WebSocketServer.onlineCount;
        
    
    
  3. 添加配置文件
    ````java
    @Configuration
    public class WebSocketConfig

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

####方法二

  1. 编写消息处理类
public class WebSocketMessageHandler extends TextWebSocketHandler 

 /**
  * 静态常量,保存连接数量,线程安全
  */
 private static long onlineCount = 0;

 /**
  * 保存客户端信息
  */
 private static CopyOnWriteArraySet<WebSocketSession> webSocketSet = new CopyOnWriteArraySet();

 /**
  * 会话信息
  */
 private WebSocketSession session;

 public WebSocketMessageHandler()
     super();
 

 /**
  * 连接建立之后
  * @param session
  * @throws Exception
  */
 public void afterConnectionEstablished(WebSocketSession session) throws Exception
     this.session = session;
     webSocketSet.add(session);
     addOnlineCount();
     System.out.println("连接成功,当前连接数:"+getOnlineCount());
 

 /**
  * 处理收到的websocket信息
  */
 @Override
 protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception 
     String payload = message.getPayload();
     System.out.println("sadddddd");
     sendMessage(payload);
 

 public void handleTransportError(WebSocketSession session, Throwable var2) throws Exception

 

 public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception
    webSocketSet.remove(session);
     subOnlineCount();
     System.out.println("连接断开,当前连接数:"+getOnlineCount());

 

 private void sendMessage(String message)  throws IOException 
     for (WebSocketSession session: webSocketSet ) 
         session.sendMessage(new TextMessage( message));
     
 

 ///////
 private synchronized void addOnlineCount()

     onlineCount++;
 
 private synchronized void subOnlineCount()

     onlineCount--;
 
 private synchronized long  getOnlineCount()

     return this.onlineCount;
 
  1. 位置文件

@Configuration
public class WebSocketConfig implements WebSocketConfigurer 

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) 
        webSocketHandlerRegistry.addHandler(handler(),"/notice/id")//访问地址
        .setAllowedOrigins("*");///解决跨域问题
    

    public WebSocketHandler handler()
        return  new WebSocketMessageHandler();
    

总结

1.网上找资料按照第一种实现,结果总是报错,比较靠谱的解释是aop拦截问题,使得ServerEndpointExporter
注册不进去;

2.第二种方法有效,一定不要忘记加依赖文件

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

以上是关于springboot 集成 websocket的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot集成Kafka

SpringBoot.03.SpringBoot集成jsp

SpringBoot.03.SpringBoot集成jsp

SpringBoot.03.SpringBoot集成jsp

SpringBoot使用·上篇(SpringBoot注解+集成JDBC+集成druid(德鲁伊)+sql监控)

SpringBoot使用·上篇(SpringBoot注解+集成JDBC+集成druid(德鲁伊)+sql监控)