IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> springboot整合Websocket以及一种使用场景 -> 正文阅读

[网络协议]springboot整合Websocket以及一种使用场景

一、websocket的执行流程

借用b站大佬的图讲解下:分三步走。
在这里插入图片描述
二、springboot整合websocket

1.导入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
            <version>2.4.4</version>
        </dependency>

2.初始化 ServerEndpointExporter

package com.yblue.chat.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * @author JiaXinMa
 * @description 初始化 ServerEndpointExporter
 *              注意:如果使用独立的servlet容器,就不需要注入ServerEndpointExporter,
 *              因为servlet容器会自己提供和管理
 * @date 2021/8/16
 */
@Configuration
public class WebsocketConfig {

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

3.配置ServerEndpoint的方法

package com.yblue.chat.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author JiaXinMa
 * @description Websocket的主要调用方法
 * @date 2021/8/16
 */
//  ws://localhost:8080/websocket/test
@Slf4j
@ServerEndpoint("/websocket/test")
@Component
public class WebsocketEndpoint {

    //注意;每次刷新页面(就是重新连接)session都会变
    // 同时服务端会自动去调用关闭连接,然后再建立连接

    private static Map<Object, Session> sessionMap = new ConcurrentHashMap<>();

    //建立连接
    @OnOpen
    public void onOpen(Session session) {
        sessionMap.put(session.getId(), session);
        log.info("建立连接成功!!!");

        log.info("现有的连接数:" + sessionMap.size());
    }

    //关闭连接
    @OnClose
    public void onClose(Session session) {
        try {
            sessionMap.remove(session.getId());
            session.close();
            log.info("关闭连接成功!!!");
            log.info("现有的连接数:" + sessionMap.size());
        } catch (IOException e) {
            log.info("关闭连接失败!!!");
        }
    }


    //群发消息
    @OnMessage
    public void onMessage(String message) throws IOException {
        Collection<Session> sessions = sessionMap.values();
        Iterator<Session> iterator = sessions.iterator();

        while (iterator.hasNext()) {
            iterator.next().getBasicRemote().sendText(message);
        }
        log.info("实时通讯成功!!!");
    }


}

4.可能遇到的场景:

4.1 聊天室(我这个demo不适用,可以去修改,原理懂了都一样),建议可以采用 环信即时通讯 的技术

4.2 就是那些实时监控数据变化的的场景(比如我所在公司有个社区开门记录数据实时更新)

  该场景逻辑是:人脸开门,然后后台有个echarts统计的表格实时变化

下面写个小demo测试下:

控制层代码:

package com.yblue.chat.controller;

import com.yblue.chat.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author JiaXinMa
 * @description
 * @date 2021/8/16
 */
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    //不用返回数据的,因为我在业务层调用WebsocketEndpoint的方法,他实时同步过去了
    @GetMapping("/findById")
    public void findById(Integer userId) {
        userService.findById(userId);
    }

    //这里get请求主要是我想在地址栏测试而已,不要在意这些细节
    @GetMapping("/update")
    public void update(Integer userId) {
        userService.update(userId);
    }

}

业务层代码:

package com.yblue.chat.service;

import com.yblue.chat.config.WebsocketEndpoint;
import com.yblue.chat.mapper.UserMapper;
import com.yblue.chat.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.websocket.Session;
import java.io.IOException;

/**
 * @author JiaXinMa
 * @description
 * @date 2021/8/16
 */
@Service
@Transactional
@Slf4j
public class UserService {

    @Autowired(required = false)
    UserMapper userMapper;

    @Autowired
    WebsocketEndpoint websocketEndpoint;

    public void findById(Integer userId) {
        try {
            User user = userMapper.selectById(userId);
            //这里调用,虽然可以在WebsocketEndpoint连接的时候调用
            // 但是要注意bean的生命周期,需要特殊处理下,我菜暂时不会
            //这里推送数据用json字符串,可以考虑用阿里巴巴的JSONObject这个类去转换
            websocketEndpoint.onMessage(user.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void update(Integer userId) {
        try {
            User user = new User();
            user.setUserId(userId);
            user.setName("我被改了");
            userMapper.updateById(user);

            user = userMapper.selectById(userId);
            //这里调用也调用WebsocketEndpoint的推送数据方法
            websocketEndpoint.onMessage(user.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
}

5.测试

我是综合这个网站(http://coolaf.com/tool/chattest)测试和地址栏测试的,效果如下
5.1建立连接
5.2查询数据
5.3修改数据
在这里插入图片描述
5.4关闭窗口刷新界面测试
如下效果,测试结果是会自动调用关闭连接方法(避免了只存不移除导致没有被垃圾回收,造成内存溢出),为了能够被回收,提高系统性能
在这里插入图片描述
这只是我对websocket比较浅薄的见解,如果有不对的地方,大佬帮忙指正。

想看更多精彩内容,可以关注我的博客园
我的博客园

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 13:03:32  更:2021-08-18 13:03:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:47:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码