专栏首页海加尔金鹰的专栏springboot整合websocket技术

springboot整合websocket技术

什么是Webscoket

简单来说就是一个基于TCP的持久化的网络通信协议。主要作用就是:服务端可以主动推送信息给客户端,不需要客户端重复的向服务端发请求查询。

具体详细说明:https://www.zhihu.com/question/20215561 (PS:写的是真的简单易懂)

springboot整合Webscoket

实现websocket有多种方式:最简单的H5, sockjs以及使用STOMP协议

开发环境

  1. JDK版本1.8
  2. springboot版本2.1.0
  3. 开发工具:IDEA MVAEN

基于H5的websocket实现

第一步 引入依赖

在springboot2.0版本之后,官方添加了Webscoket的依赖,因此只需要在pom当中引入

        <!-- 引入websocket-->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-websocket</artifactId>
       </dependency>

第二步 配置WebSocket

/**
 * @Auther: HJLJY
 * @Date: 2019/1/25 0025 16:45
 * @Description:  websocket客户端配置类
 *
 * @EnableWebSocket   表示该类支持websocket
 * @EnableWebSocketMessageBroker   websocket使用STOMP协议进行消息的传递  还需要进行额外的配置不然会报错
 */
@Configuration
@EnableWebSocket
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

第三步 设置服务端地址

/**
 * @Auther: HJLJY
 * @Date: 2019/1/25 0025 16:56
 * @Description:
 * @ServerEndpoint 用于配置websocket的地址    ws://127.0.0.1:8080/websocket
 */
@ServerEndpoint(value = "/websocket")
@Component
public class WebSocketServer {
    //TODO 这里根据实际业务进行代码的书写

    //concurrent包的线程安全Set,每个客户端的websocket连接会创建一个WebSocketServer对象。
    private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();

    //这个session是每个websocket与某个客户端的连接会话,通过它与客户端进行数据交互。
    private Session session;

    /**
     * websocket连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        webSocketSet.add(this);     //加入set中
        System.out.println("有新连接加入!sessionID为:" + session.getId());
        try {
            sendMessage("恭喜 连接websocket服务端成功");
        } catch (IOException e) {
            System.out.println("IO异常");
        }
    }

    /**
     * 关闭websocket连接调用的方法
     */
    @OnClose
    public void onClose() {
        webSocketSet.remove(this);  //从set中删除
        System.out.println("有一连接关闭!sessionID为:" + session.getId());
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message) {
        System.out.println("来自客户端的消息:" + message);
        //将接受到的消息群发给所有websocket连接。这里也可以根据实际需求修改代码,将接受到的信息发送给某个指定的websocket连接。
        for (WebSocketServer item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 发生错误时调用
     */
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("发生错误");
        error.printStackTrace();
    }
    
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);  //这两个方法是同步和异步的关系
        //this.session.getAsyncRemote().sendText(message);
    }
}

第四步 客户端实现

客户端的常见api onopen : 用于建立连接成功后的回调 onclose : 用于关闭连接后的回调 onmessage :用于接受到消息后的回调 send() :用于发送消息 具体详细说明:http://www.ruanyifeng.com/blog/2017/05/websocket.html HTML具体代码:

<!DOCTYPE HTML>
<html>
<head>
    <title>测试websocket</title>
</head>

<body>
TEST websocket<br/>
<input id="text" type="text"/>
<button onclick="send()">Send</button>

<button onclick="closeWebSocket()">Close</button>
<div id="message">
</div>
</body>

<script type="text/javascript">
    //这一步就是向后台建立连接    协议开头不是HTTP 而是ws或者wss
    var websocket = new WebSocket("ws://localhost:8080/websocket");

    //关闭连接
    function closeWebSocket() {
        websocket.close();
    }

    //发送消息
    function send() {
        var message = document.getElementById('text').value;
        websocket.send(message);
    }

    //连接发生错误的回调方法
    websocket.onerror = function () {
        setMessageInnerHTML("error");
    };

    //连接成功建立的回调方法
    websocket.onopen = function (event) {
        setMessageInnerHTML("开启连接");
    }

    //接收到消息的回调方法
    websocket.onmessage = function (event) {
        setMessageInnerHTML(event.data);
    }

    //连接关闭的回调方法
    websocket.onclose = function () {
        setMessageInnerHTML("关闭连接");
    }

    //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
    window.onbeforeunload = function () {
        websocket.close();
    }

    //将消息显示在网页上
    function setMessageInnerHTML(innerHTML) {
        document.getElementById('message').innerHTML += innerHTML + '<br/>';
    }


</script>
</html>

最后启动springboot项目进入到刚才的html界面(开启两个浏览器同时进入进行测试)查看效果就可以了。

参考资料

简单实现:https://www.cnblogs.com/bianzy/p/5822426.html 使用spring boot +WebSocket实现(后台主动)消息推送:https://blog.csdn.net/zhangdehua678/article/details/78913839/ 基于STOMP协议:https://www.jianshu.com/p/19cec6fbf422


标题:springboot整合websocket技术 作者:海加尔金鹰 地址:https://www.hjljy.cn/articles/2019/01/26/1548488552918.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计模式学习笔记之享元模式

    这是一篇学习笔记,内容很多是来源于网上的资料,然后按照自己学习情况进行的总结,有些是自身的感受,有些是网上比较好的资料的引用。

    海加尔金鹰
  • Nginx学习日志(二)通过反向代理将不同域名映射到不同的端口

    由于自己进行学习,所以只买了一台服务器,但是想弄多个项目部署在同一台机器上,通过不同的域名访问不同的项目。例如: 输入 www.xxx.com 访问的是服...

    海加尔金鹰
  • Http,Https,Restful,Webservice,WebSocket,Rpc,Rmi,SOA,分布式,微服务,集群等概念

    在JAVA开发学习过程当中,总是会接触到很多概念性的名词。特此简单的总结记录一下相关名词对应的概念。

    海加尔金鹰
  • 结合WebSocket和Openlayers4实现地图内容的刷新

    本文讲述如何结合WebSocket和Openlayers4实现地图内容的实时刷新。

    lzugis
  • Django 2.1.7 通过dwebsocket实现websocket

    上面已经安装好了dwebsocket库,那么如何使用呢? 使用的方法有两种情况,如下:

    Devops海洋的渔夫
  • 搭建websocket消息推送服务,必须要考虑的几个问题

    近年,不论是正在快速增长的直播,远程教育以及IM聊天场景,还是在常规企业级系统中用到的系统提醒,对websocket的需求越来越大,对websocket的要求也...

    GoEasy消息推送
  • socket系列(二)——Javaee实现实时通信

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    逝兮诚
  • 实现websocket的两种方式

    1.两种方式,一种使用tomcat的websocket实现,一种使用spring的websocket

    凯哥Java
  • python测试开发django-81.dwebsocket实现websocket

    HTTP 协议有一个缺陷:通信只能由客户端发起,做不到服务器主动向客户端推送信息。 WebSocket 协议它的最大特点就是,服务器可以主动向客户端推送信息,客...

    上海-悠悠
  • 空间单细胞DNA测序

    不知不觉在单细胞转录组领域做知识分析也快两年了,很幸运聚集了五个小伙伴携手共进,我们承诺不间断更新5个月,把我们这两年的学习成果全部掏出来给大家,包括5个栏目:

    生信技能树jimmy

扫码关注云+社区

领取腾讯云代金券