js 链接websocket马上断开_Spring Boot(七)Spring Boot的WebSocket

v2-12324278da88bd199c08d8b4c66ff9e4_1440w.jpg?source=172ae18b
你好,专注于:Spring Boot ,微服务 和 前端APP开发,闲暇之余一起聊聊职场规划,个人成长,还能带你一起探索 副业赚钱渠道,在提升技术的同时我们一起交流 敏捷流程 提高工作效率,从技术到管理一步步提升自我!
标签:一个执着的职场程序员!

本文是Spring Boot系列的第七篇,了解前面的文章有助于更好的理解本文:

1.Spring Boot(一)初识Spring Boot框架
2.Spring Boot(二)Spring Boot基本配置
3.Spring Boot(三)Spring Boot自动配置的原理
4.Spring Boot(四)Spring Boot web项目开发
5.Spring Boot(五)Spring Boot web开发项目(2)配置
6.Spring Boot(六)Spring Boot web开发 SSL配置

前言

(一). 什么是WebSocket

(二). WebSocket实战

上篇文章为大家讲述了 Spring Boot的SSL配置,http转https的原理;本篇文章接着上篇内容继续为大家介绍SpringBoot中 WebSocket的功能。

(一). 什么是WebSocket

WebSocket为浏览器和服务器之间提供了双工异步通信功能,即可以利用浏览器给服务器发送消息,服务器也可以向浏览器发送消息。

WebSocket是一个通过socket来实现双工异步通信能力的,但是直接使用WebSocket协议开发程序比较繁琐,我们使用他们的自协议 STOMP,它是一个更高级的协议,STOMP协议使用一个基于帧的格式来定义消息,于http的request和response类似。

这边文字对于Websocket的原理和使用场景说的很详细,小伙伴可以 看一下https://www.zhihu.com/question/20215561

(二). WebSocket实战

1.新建项目

v2-965100cacef87dcc88f004defe7837af_b.jpg

v2-a439f1a1a0006d9f731479a89da2e04b_b.jpg

v2-b3df7a832e79d0ebc93e954c7e666ff5_b.jpg

注意看在创建的时候 我们添加了两个依赖: Thymeleaf和WebSocket依赖2. 配置websocket
需要在配置类上使用@EnableWebSocketMessageBroker 注解开启 Websocket的支持,并实现 WebSocketMessageBrokerConfigurer类

代码如下:

package org.cxzc.myyoung.springbootwebsocket;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
        stompEndpointRegistry.addEndpoint("/endpoint").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
    }
}

代码解释:

1.@EnableWebSocketMessageBroker注解 表示开启使用STOMP协议来传输基于代理的消息,Broker就是代理。

2.registerStompEndpoints方法表示注册STOMP协议的节点,并映射指定的URL。

3.stompEndpointRegistry.addEndpoint("/endpoint").withSockJS();用来注册STOMP协议节点,并指定使用SockJS协议。

4.configureMessageBroker方法用来配置消息代理,由于我们是广播式,这里的消息代理是/topic

3. 添加浏览器向服务器发送消息的类
浏览器方发送来的消息用这个类来接收

package org.cxzc.myyoung.springbootwebsocket;
public class RequestMessage {
    private String name;

    public String getName() {
        return name;
    }
}

4. 添加服务器返回给浏览器消息的类

package org.cxzc.myyoung.springbootwebsocket;
public class ResponseMessage {
    private String responseMessage;

    public ResponseMessage(String responseMessage) {
        this.responseMessage = responseMessage;
    }

    public String getResponseMessage() {
        return responseMessage;
    }
}

5. 创建控制器类

package org.cxzc.myyoung.springbootwebsocket;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

@Controller
public class WsController {
    @MessageMapping("/welcome")
    @SendTo("/topic/getResponse")
    public ResponseMessage say(RequestMessage message) {
        System.out.println(message.getName());
        return new ResponseMessage("welcome," + message.getName() + " !");
    }
}

代码解释:
1. 当浏览器向服务器发请求的时候,通过@MessageMapping 映射/welcome这个地址,类似于@RequestMapping

2. @SendTo注解表示当服务器有消息需要推送的时候,会对订阅了@SendTo中路径的浏览器发送消息。

6. 添加演示界面
首先添加页面需要几个脚本,stomp.min.js , sockjs.min.js , jquery,该脚本可以砸源码中get,将上述脚本放在 src/main/resources/templates/js 下

新建页面:代码如下:

<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>广播式WebSocket</title>
    <script th:src="@{js/sockjs.min.js}"></script>
    <script th:src="@{js/stomp.js}"></script>
    <script th:src="@{js/jquery-3.1.1.js}"></script>
</head>
<body onload="disconnect()">
<noscript><h2 style="color: #e80b0a;">Sorry,浏览器不支持WebSocket</h2></noscript>
<div>
    <div>
        <button id="connect" onclick="connect();">连接</button>
        <button id="disconnect" disabled="disabled" onclick="disconnect();">断开连接</button>
    </div>

    <div id="conversationDiv">
        <label>输入你要发送的信息</label><input type="text" id="name"/>
        <button id="sendName" onclick="sendName();">发送</button>
        <p id="response"></p>
    </div>
</div>
<script type="text/javascript">
    var stompClient = null;
    function setConnected(connected) {
        document.getElementById("connect").disabled = connected;
        document.getElementById("disconnect").disabled = !connected;
        document.getElementById("conversationDiv").style.visibility = connected ? 'visible' : 'hidden';

        $("#response").html();
    }
    function connect() {
        var socket = new SockJS('/endpointCXZC');
        stompClient = Stomp.over(socket);
        stompClient.connect({}, function (frame) {
            setConnected(true);
            console.log('Connected:' + frame);
            stompClient.subscribe('/topic/getResponse', function (response) {
                showResponse(JSON.parse(response.body).responseMessage);
            })
        });
    }
    function disconnect() {
        if (stompClient != null) {
            stompClient.disconnect();
        }
        setConnected(false);
        console.log('Disconnected');
    }
    function sendName() {
        var name = $('#name').val();
        console.log('name:' + name);
        stompClient.send("/welcome", {}, JSON.stringify({'name': name}));
    }
    function showResponse(message) {
        $("#response").html(message);
    }
</script>
</body>
</html>

1. connect方法是当我点击连接按钮的时候执行的,var socket = new SockJS('/endpointCXZC');表示连接的SockJS的endpoint名称为/endpointCXZC
2. stompClient = Stomp.over(socket);表示使用STOMP来创建WebSocket客户端。然后调用stompClient中的connect方法来连接服务端。然后再通过调用stompClient中的subscribe方法来订阅/topic/getResponse发送来的消息,也就是我们在Controller中的say方法上添加的@SendTo注解的参数。
3. stompClient中的send方法表示发送一条消息到服务端

7.配置 viewController
目的是为ws.html提供便捷的路径映射。

package org.cxzc.myyoung.springbootwebsocket;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/ws").setViewName("/ws");
    }
}

我们映射到ws路径上了。

浏览器访问 ,打开多个浏览器,显示如下:

v2-00fd4e9b00efe025619b78b0447cbb11_b.jpg

当我在一个浏览器输入信息发送后 其他浏览器能够收到消息。

ok,Spring Boot 使用WebSocket实现消息推送 到这里就完成了,如果小伙伴还有疑问,可以 关注我,我们一起进步

参考:
1. 《JavaEE开发的颠覆者 Spring Boot实战》

本案例下载地址:

https://github.com/ProceduralZC/itcxzc/tree/master/springbootwebsocket

作者:小小蒲公英
你好,专注于:Spring Boot ,微服务 和 前端APP开发,闲暇之余一起聊聊职场规划,个人成长,还能带你一起探索 副业赚钱渠道,在提升技术的同时我们一起交流 敏捷流程 提高工作效率,从技术到管理一步步提升自我!
标签:一个执着的职场程序员!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Netty-WebSocket-Spring-Boot-Starter是一个用于将Websocket集成到Spring Boot应用程序中的库。它使用Netty作为底层框架,提供了一种快速和可靠的方式来处理异步通信。 这个库提供了一种简单的方法来创建Websocket端点,只需要使用注释和POJO类即可。在这些端点上可以添加动态的事件处理程序,以处理连接断开连接和消息事件等。 此外,Netty-WebSocket-Spring-Boot-Starter还包括了一些安全性的特性,如基于令牌的授权和XSS保护,可以帮助您保持您的Websocket应用程序安全。 总的来说,Netty-WebSocket-Spring-Boot-Starter提供了一种快速和易于使用的方式来构建Websocket应用程序,使得它成为应用程序开发人员的有用工具。 ### 回答2: netty-websocket-spring-boot-starter 是一个开源的 Java Web 开发工具包,主要基于 Netty 框架实现了 WebSocket 协议的支持,同时集成了 Spring Boot 框架,使得开发者可以更加方便地搭建 WebSocket 服务器。 该工具包提供了 WebSocketServer 配置类,通过在 Spring Boot 的启动配置类中调用 WebSocketServer 配置类,即可启动 WebSocket 服务器。同时,该工具包还提供了多种配置参数,如端口号、URI 路径、SSL 配置、认证配置等等,可以根据业务需求进行自定义配置。 此外,该工具包还提供了一些可扩展的接口和抽象类,如 WebSocketHandler、ChannelHandlerAdapter 等,可以通过继承和实现这些接口和抽象类来实现业务逻辑的处理和拓展。 总的来说,netty-websocket-spring-boot-starter 提供了一个高效、简单、易用的 WebSocket 服务器开发框架,可以减少开发者的开发成本和工作量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值