springboot整合websocket入门 springboot整合websocket最基础入门使用教程详解

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

springboot整合websocket入门 springboot整合websocket最基础入门使用教程详解

小哇666   2021-03-24 我要评论
想了解springboot整合websocket最基础入门使用教程详解的相关内容吗,小哇666在本文为您仔细讲解springboot整合websocket入门的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:springboot整合websocket入门,springboot整合websocket,下面大家一起来学习吧。

项目最终的文件结构


1 添加maven依赖

 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.12</version>
</dependency>

2 编写配置类 WebSocketConfig

package cn.huawei.socket_test_1.config;
 
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
 
@Component
public class WebSocketConfig {
 
  /**
   * ServerEndpointExporter 作用
   *
   * 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint
   *
   * @return
   */
  @Bean
  public ServerEndpointExporter serverEndpointExporter() {
    return new ServerEndpointExporter();
  }
}

3 编写核心业务类 WebSocket

package cn.huawei.socket_test_1.websock;
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.util.concurrent.ConcurrentHashMap;
 
/**
 * @ServerEndpoint 注解的作用
 *
 * @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
 * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
 */
 
@Slf4j
@Component
@ServerEndpoint("/websocket/{name}")
public class WebSocket {
 
  /**
   * 与某个客户端的连接对话,需要通过它来给客户端发送消息
   */
  private Session session;
 
  /**
   * 标识当前连接客户端的用户名
   */
  private String name;
 
  /**
   * 用于存所有的连接服务的客户端,这个对象存储是安全的
   * 注意这里的kv,设计的很巧妙,v刚好是本类 WebSocket (用来存放每个客户端对应的MyWebSocket对象)
   */
  private static ConcurrentHashMap<String,WebSocket> webSocketSet = new ConcurrentHashMap<>();
 
 
  /**
   * 连接建立成功调用的方法
   * session为与某个客户端的连接会话,需要通过它来给客户端发送数据
   */
  @OnOpen
  public void OnOpen(Session session, @PathParam(value = "name") String name){
    log.info("----------------------------------");
    this.session = session;
    this.name = name;
    // name是用来表示唯一客户端,如果需要指定发送,需要指定发送通过name来区分
    webSocketSet.put(name,this);
    log.info("[WebSocket] 连接成功,当前连接人数为:={}",webSocketSet.size());
    log.info("----------------------------------");
    log.info("");
 
    GroupSending(name+" 来了");
  }
 
  /**
   * 连接关闭调用的方法
   */
  @OnClose
  public void OnClose(){
    webSocketSet.remove(this.name);
    log.info("[WebSocket] 退出成功,当前连接人数为:={}",webSocketSet.size());
 
    GroupSending(name+" 走了");
  }
 
  /**
   * 收到客户端消息后调用的方法
   */
  @OnMessage
  public void OnMessage(String message_str){
    log.info("[WebSocket] 收到消息:{}",message_str);
    //判断是否需要指定发送,具体规则自定义
    //message_str的格式 TOUSER:user2;message:aaaaaaaaaaaaaaaaaa;
    if(message_str.indexOf("TOUSER") == 0){
      //取出 name和message的值
      String[] split = message_str.split(";");
      String[] split1 = split[0].split(":");
      String[] split2 = split[1].split(":");
      String name = split1[1];
      String message = split2[1];
      //指定发送
      AppointSending(name,message);
    }else{
      //群发
      GroupSending(message_str);
    }
  }
 
  /**
   * 发生错误时调用
   * @param session
   * @param error
   */
  @OnError
  public void onError(Session session, Throwable error){
    log.info("发生错误");
    error.printStackTrace();
  }
 
  /**
   * 群发
   * @param message
   */
  public void GroupSending(String message){
    for (String name : webSocketSet.keySet()){
      try {
        webSocketSet.get(name).session.getBasicRemote().sendText(message);
      }catch (Exception e){
        e.printStackTrace();
      }
    }
  }
 
  /**
   * 指定发送
   * @param name
   * @param message
   */
  public void AppointSending(String name,String message){
    try {
      webSocketSet.get(name).session.getBasicRemote().sendText(message);
    }catch (Exception e){
      e.printStackTrace();
    }
  }
}

4 因前端不熟悉,所以使用 http://coolaf.com/tool/chattest 在线测试
因代码中 @ServerEndpoint("/websocket/{name}") 是这样定义的,所以 通过下面的方式连接上去,测试群发和指定发送

因java代码中这样定义的消息,可以指定发送某个人,测试

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们