Springboot整合Websocket

Springboot整合Websocket

引入maven
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
配置springboot
server:
    port: 5003
编写 ApplicationConfig 类配置websocket
@Configuration
public class ApplicationConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}
核心代码
  1. @ServerEndpoint(“/api/pushMessage/{userId}”) 前端通过此 URI 和后端交互,建立连接
  2. @Component 将此类交给 spring 管理
  3. @OnOpen websocket 建立连接的注解,前端触发上面 URI 时会进入此注解标注的方法
  4. @OnMessage 收到前端传来的消息后执行的方法
  5. @OnClose 顾名思义关闭连接,销毁 session
  6. 因为WebSocket是类似客户端服务端的形式(采用ws协议),那么这里的WebSocketServer其实就相当于一个ws协议的Controller
  7. 新建一个ConcurrentHashMap webSocketMap 用于接收当前userId的WebSocket,方便IM之间对userId进行推送消息
测试代码
@Component
@Slf4j
@ServerEndpoint("/api/pushMessage/{userId}")
public class MyWebsocket {
    private Session session;

    private String userId;

    private static ConcurrentHashMap<String,MyWebsocket> webSocketSet = new ConcurrentHashMap<>();
    /**
     * 连接建立成功调用的方法
     * session为与某个客户端的连接会话,需要通过它来给客户端发送数据
     */
    @OnOpen
    public void OnOpen(Session session, @PathParam(value = "userId") String userId){
        log.info("----------------------------------");
        this.session = session;
        this.userId = userId;
        // userId是用来表示唯一客户端,如果需要指定发送,需要指定发送通过userId来区分
        webSocketSet.put(userId,this);
        log.info("[WebSocket] 连接成功,当前连接人数为:={}",webSocketSet.size());
        log.info("----------------------------------");
        log.info("");

        GroupSending(userId+" 来了");
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void OnClose(){
        webSocketSet.remove(this.userId);
        log.info("[WebSocket] 退出成功,当前连接人数为:={}",webSocketSet.size());

        GroupSending(userId+" 走了");
    }

    /**
     * 收到客户端消息后调用的方法
     */
    @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();
        }
    }
}
测试websocket

在线测试websocket网站: http://coolaf.com/tool/chattest

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值