文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot怎么实现WebSocket即时通讯

2023-06-30 02:46

关注

这篇“SpringBoot怎么实现WebSocket即时通讯”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringBoot怎么实现WebSocket即时通讯”文章吧。

1、引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.3</version></dependency>

2、WebSocketConfig 开启WebSocket

package com.shucha.deveiface.web.config; import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.socket.server.standard.ServerEndpointExporter;  @Configurationpublic class WebSocketConfig {    @Bean    public ServerEndpointExporter serverEndpointExporter(){        return new ServerEndpointExporter();    }}

3、WebSocketServer

package com.shucha.deveiface.web.ws; import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;import org.springframework.web.socket.WebSocketSession; import javax.websocket.*;import javax.websocket.server.PathParam;import javax.websocket.server.ServerEndpoint;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.CopyOnWriteArraySet; @Component@ServerEndpoint("/webSocket/{userId}")@Slf4jpublic class WebSocketServer {    private Session session;    private String userId;        private static int onlineCount = 0;    private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();         private static ConcurrentHashMap<String,WebSocketServer> webSocketMap = new ConcurrentHashMap();         private final static List<Session> SESSIONS = Collections.synchronizedList(new ArrayList<>());         @OnOpen    public void onOpen(Session session, @PathParam("userId") String userId) {        this.session = session;        this.userId = userId;        webSocketSet.add(this);        SESSIONS.add(session);        if (webSocketMap.containsKey(userId)) {            webSocketMap.remove(userId);            webSocketMap.put(userId,this);        } else {            webSocketMap.put(userId,this);            addOnlineCount();        }        // log.info("【websocket消息】有新的连接, 总数:{}", webSocketSet.size());        log.info("[连接ID:{}] 建立连接, 当前连接数:{}", this.userId, webSocketMap.size());    }         @OnClose    public void onClose() {        webSocketSet.remove(this);        if (webSocketMap.containsKey(userId)) {            webSocketMap.remove(userId);            subOnlineCount();        }        // log.info("【websocket消息】连接断开, 总数:{}", webSocketSet.size());        log.info("[连接ID:{}] 断开连接, 当前连接数:{}", userId, webSocketMap.size());    }         @OnError    public void onError(Session session, Throwable error) {        log.info("[连接ID:{}] 错误原因:{}", this.userId, error.getMessage());        error.printStackTrace();    }         @OnMessage    public void onMessage(String message) {        // log.info("【websocket消息】收到客户端发来的消息:{}", message);        log.info("[连接ID:{}] 收到消息:{}", this.userId, message);    }         public void sendMessage(String message,Long userId) {        WebSocketServer webSocketServer = webSocketMap.get(String.valueOf(userId));        if (webSocketServer!=null){            log.info("【websocket消息】推送消息, message={}", message);            try {                webSocketServer.session.getBasicRemote().sendText(message);            } catch (Exception e) {                e.printStackTrace();                log.error("[连接ID:{}] 发送消息失败, 消息:{}", this.userId, message, e);            }        }    }         public void sendMassMessage(String message) {        try {            for (Session session : SESSIONS) {                if (session.isOpen()) {                    session.getBasicRemote().sendText(message);                    log.info("[连接ID:{}] 发送消息:{}",session.getRequestParameterMap().get("userId"),message);                }            }        } catch (Exception e) {            e.printStackTrace();        }    }         public static synchronized int getOnlineCount() {        return onlineCount;    }         public static synchronized void addOnlineCount() {        WebSocketServer.onlineCount++;    }         public static synchronized void subOnlineCount() {        WebSocketServer.onlineCount--;    } }

4、测试连接发送和接收消息

package com.shucha.deveiface.web.controller; import com.alibaba.fastjson.JSONObject;import com.shucha.deveiface.web.ws.WebSocketServer;import lombok.Data;import lombok.experimental.Accessors;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController; @RestController@RequestMapping("/web")public class TestWebSocket {    @Autowired    private WebSocketServer webSocketServer;         @GetMapping("/test")    public void test(){        for (int i=1;i<4;i++) {            WebsocketResponse response = new WebsocketResponse();            response.setUserId(String.valueOf(i));            response.setUserName("姓名"+ i);            response.setAge(i);            webSocketServer.sendMessage(JSONObject.toJSONString(response), Long.valueOf(String.valueOf(i)));        }    }         @GetMapping("/sendMassMessage")    public void sendMassMessage(){        WebsocketResponse response = new WebsocketResponse();        response.setUserName("群发消息模板测试");        webSocketServer.sendMassMessage(JSONObject.toJSONString(response));    }     @Data    @Accessors(chain = true)    public static class WebsocketResponse {        private String userId;        private String userName;        private int age;    }}

5、在线测试地址

websocket 在线测试

6、测试截图

访问测试发送消息:http://localhost:50041//web/test

测试访问地址:ws://192.168.0.115:50041/webSocket/1   wss://192.168.0.115:50041/webSocket/2

SpringBoot怎么实现WebSocket即时通讯

SpringBoot怎么实现WebSocket即时通讯

SpringBoot怎么实现WebSocket即时通讯

以上就是关于“SpringBoot怎么实现WebSocket即时通讯”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯