首页 > 其他分享 >websocket实现消息实时通信

websocket实现消息实时通信

时间:2024-05-27 16:22:11浏览次数:27  
标签:userName webSocketMap websocket void 通信 实时 session public 客户端

后端代码实现

1、导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <version>3.2.5</version>
</dependency>

2、创建websocket客户端对象。

@Getter
@Setter
public class WebSocketClient {

    // 与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;

    //连接的uri
    private String uri;
}

3、创建websocket服务类

@ServerEndpoint(value = "/websocket/message/{userName}")
@Component("msgWebSocketService")
public class WebSocketService {
    /**
     * 日志
     */
    private static final Logger LOG = LoggerFactory.getLogger(WebSocketService.class);

    /**
     * concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。
     */
    private static ConcurrentHashMap<String, WebSocketClient> webSocketMap = new ConcurrentHashMap<>();

    /**
     * 与某个客户端的连接会话,需要通过它来给客户端发送数据
     * */
    private Session session;

    /**
     * 接收userName
     * */
    private String userName="";


    /**
     * 连接建立成功调用的方法
     *
     * */
    @OnOpen
    public void onOpen(Session session, @PathParam("userName") String userName) {
        this.session = session;
        this.userName= userName;
        WebSocketClient client = new WebSocketClient();
        client.setSession(session);
        client.setUri(session.getRequestURI().toString());
        webSocketMap.put(userName, client);
        LOG.info("----------------------------|-----------------------------------------------");
        LOG.info("用户{}连接消息中心。", userName);
        try {
            sendMessage("消息中心:连接成功!");
        } catch (IOException e) {
            LOG.error("消息中心:网络异常!");
        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        if(webSocketMap.containsKey(userName)){
            webSocketMap.remove(userName);
        }
        LOG.info("用户{}断开消息中心连接", userName);
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        LOG.info("收到用户{}向消息中心推送的消息:{}", userName, message);
    }

    /**
     * 捕获并记录错误信息
     */
    @OnError
    public void one rror(Session session, Throwable error) {
        LOG.error("用户{}连接消息中心异常:{}", userName, error.getMessage());
        error.printStackTrace();
    }

    /**
     * 连接服务器成功后主动推送
     */
    public void sendMessage(String message) throws IOException {
        synchronized (session){
            this.session.getBasicRemote().sendText(message);
        }
    }

    /**
     * 向指定客户端发送消息
     * @param userName 用户名
     * @param message 消息内容
     */
    public static void sendMessage(String userName, String message){
        try {
            WebSocketClient webSocketClient = webSocketMap.get(userName);
            if(webSocketClient!=null){
                webSocketClient.getSession().getBasicRemote().sendText(message);
            }
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
    }


    public static ConcurrentHashMap<String, WebSocketClient> getWebSocketMap() {
        return webSocketMap;
    }

    public static void setWebSocketMap(ConcurrentHashMap<String, WebSocketClient> webSocketMap) {
        WebSocketService.webSocketMap = webSocketMap;
    }

    public Session getSession() {
        return session;
    }

    public void setSession(Session session) {
        this.session = session;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}

4、推送消息给客户端

webSocketService.sendMessage('用户', '消息内容')

标签:userName,webSocketMap,websocket,void,通信,实时,session,public,客户端
From: https://www.cnblogs.com/IamHzc/p/18215831

相关文章

  • 【扩频通信】混沌扩频通信matlab仿真,混沌信号 高斯噪声 调制解调
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 【权威出版】2024年城市建设、智慧交通与通信网络国际会议(UCSTCN 2024)
    2024年城市建设、智慧交通与通信网络国际会议2024InternationalConferenceonUrbanConstruction,SmartTransportation,andCommunicationNetworks【1】会议简介    2024年城市建设、智慧交通与通信网络国际会议即将盛大召开,这是一次聚焦城市建设、智慧交......
  • 深度学习之基于Python+OpenCV+Tensorflow+Keras实时口罩检测系统
    欢迎大家点赞、收藏、关注、评论啦,由于篇幅有限,只展示了部分核心代码。文章目录一项目简介二、功能三、系统四.总结一项目简介  一、项目背景与意义在全球公共卫生背景下,口罩成为了重要的防护工具。特别是在疫情流行期间,确保公共场所的人们佩戴口罩对于防......
  • 嵌入式实时操作系统笔记3:FreeRTOS移植(STM32F407)_编写简单的FreeRTOS任务例程
    上文讲到UC/OSIII系统的移植,那篇文章是失败了的,网络上的资料真是层次不清,多有遗漏步骤,导致单片机连操作系统的初始化都卡在那,这次换个赛道,学FreeRTOS吧......今日任务如标题所示:FreeRTOS移植(STM32F407)_编写简单的FreeRTOS任务例程文章提供测试代码讲解、完整工程下载、测......
  • 【嵌入式DIY实例】-OLED显示DS1307/DS3231实时时钟
    OLED显示DS1307/DS3231实时时钟文章目录OLED显示DS1307/DS3231实时时钟1、DS1307/DS1321介绍2、硬件准备3、代码实现本文将展示了如何使用ESP8266NodeMCU开发板、DS3231RTC芯片和SSD1306OLED显示屏(128×64像素)构建实时时钟。DS3231RTC有一个内置......
  • 通信协议和网络协议有什么区别
    通信协议和网络协议的区别如下:含义不同。通信协议是指双方实体完成通信或服务所必须遵循的规则和约定;网络协议是为计算机网络中进行数据交换而建立的规则、标准或约定的集合,是互联网上各个计算机之间进行数据传输和交换所必须共同遵循的规范。用途不同。通信协议主......
  • c# 通过 SendMessage 实现跨进程数据通信
    usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO.MemoryMappedFiles;usingSystem.Runtime.InteropServices......
  • CV再放大招 | YOLOv10:毫秒级实时端到端目标检测开源模型
    〔探索AI的无限可能,微信关注“AIGCmagic”公众号,让智能科技点亮你的生活〕本文作者:AIGCmagic社区  猫先生5月25日凌晨,由清华多媒体智能组发布YOLOv10:毫秒级实时端到端目标检测开源模型。项目地址:https://github.com/THU-MIG/yolov10论文地址:https://arxiv.org/pdf/24......
  • 【Qnx 】Qnx IPC通信PPS
    QnxIPC通信PPSQnx自带PPS服务,PPS全称PersistentPublish/SubscribeService,就是常见的P/S通信模式。QnxPPS的通信模式是异步的,Publisher和Subscriber也无需关心对方是否存在。利用Qnx提供的PPS服务,Publisher可以通知多个Subscriber进行某种动作。该图是QNX官网的PPS示......
  • 亲测有效,通过接口实现完美身份证号有效性验证+身份证与姓名匹配查询身份实名认证接口(
    最近发现一个限时认证的接口分享给大家,有需要的拿去试下吧.附上部分密钥f478186edba9854f205a130aa888733d227a8f82f98d84b9【剩余约125450次,无时间限制】b6131281611f6e1fc86c8662f549bdd683a68517203ba312【剩余约1300次,无时段限制】01e21c3405f115deb5d7820d55d19e8b......