SpringCloud——集成WebSocket,实现站内系统通知

目录

前言

实现

1、pom文件引入包

2、WebSocketConfig.java

3、后端给前端发送系统信息

 4、发消息接口

5、前端接收/发送消息

6、例子


前言

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

WebSocket 协议本质上是一个基于 TCP 的协议。

为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息"Upgrade: WebSocket"表明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。

实现

1、pom文件引入包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2、WebSocketConfig.java

package com.hahashujia.config;

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;

/**
 * @author hahashujia
 * @describe
 * @createTime 2020-06-05 10:09
 */
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        //客户端接收服务端消息的地址的前缀信息
        config.enableSimpleBroker("/topic","/user");
        //客户端给服务端发消息的地址的前缀
        config.setApplicationDestinationPrefixes("/app");
        //给指定用户发送一对一的消息前缀是/users/。
        config.setUserDestinationPrefix("/users/");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        //添加了一个/socket端点,客户端就可以通过这个端点来进行连接
        registry.addEndpoint("/hahashujia-websocket")
                .setAllowedOrigins("*")
                .withSockJS();
    }

}

3、后端给前端发送系统信息

@Autowired
private SimpMessageSendingOperations simpMessageSendingOperations;

// receiveUser 接收者,content 接收内容
simpMessageSendingOperations.convertAndSend("/topic/" + receiveUser, content);

 4、发消息接口

package com.hahashujia.controller;

import com.hahashujia.sso.interfaces.LoginRequired;
import com.hahashujia.config.Swagger2Config;
import com.hahashujia.config.aop.annotation.ApiType;
import io.swagger.annotations.Api;
import org.apache.ibatis.annotations.Param;
import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author hahashujia
 */
@ApiType(apiTypeValue = Swagger2Config.FunctionGroup.HOME_STATISTICS)
@Api(description = "消息长连接")
@RestController
@LoginRequired
public class WebSocketTestController {

    @MessageMapping("/{ldap}")
    @SendTo("/topic/{ldap}")
    public String greeting(@Param("ldap") @DestinationVariable String ldap, String name) {
        return ldap + " Hello, " + name + "!";
    }

}

5、前端接收/发送消息

//1、引入js
//sockjs.min.js
//stomp.min.js

var stompClient = null;
var ldap = "hahashujia";

//2、初始化连接
// url里的hahashujia-websocket要和配置的socket端点一致
// '/topic/' + ldap 和后端发送连接一致
function connect() {
	var url = 'http://127.0.0.1:8045/hahashujia/hahashujia-websocket/';
    var socket = new SockJS(url);
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/' + ldap, function (massage) {
            showGreeting(massage.body);
        });
    });
}

// 断开连接
function disconnect() {
    if (stompClient !== null) {
        stompClient.disconnect();
    }
    setConnected(false);
    console.log("Disconnected");
}

// 前端发送消息,前缀是app可配置
function sendName() {
    stompClient.send("/app/" + ldap, {}, JSON.stringify({'name': $("#name").val()}));
}

6、例子

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Spring Cloud可以集成WebSocket,让你能够在分布式系统中使用实时的双向通信。下面是一些步骤来集成WebSocket: 1. 首先,你需要在Spring Boot项目中添加WebSocket的依赖。可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 2. 创建一个WebSocket配置类,该类需要继承自`AbstractWebSocketMessageBrokerConfigurer`。在该类中,你可以配置WebSocket相关的参数,例如消息代理和消息的终端点。以下是一个简单的配置类示例: ```java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/websocket").withSockJS(); } } ``` 3. 创建一个WebSocket处理器类来处理接收和发送消息的逻辑。你可以使用`@Controller`注解将该类标记为一个控制器,并使用`@MessageMapping`注解来处理特定的消息。以下是一个简单的示例: ```java @Controller public class WebSocketController { @MessageMapping("/hello") @SendTo("/topic/greetings") public String greeting(String message) { return "Hello, " + message + "!"; } } ``` 在上面的示例中,当客户端发送消息到`/hello`终端点时,服务器会将消息发送到`/topic/greetings`终端点。 4. 最后,在你的应用程序中使用WebSocket。你可以使用JavaScript的`WebSocket`对象来与服务器建立连接,并发送和接收消息。下面是一个简单的示例: ```javascript var socket = new WebSocket('ws://localhost:8080/websocket'); socket.onopen = function() { console.log('WebSocket连接已打开'); }; socket.onmessage = function(event) { console.log('收到消息: ' + event.data); }; socket.onclose = function() { console.log('WebSocket连接已关闭'); }; // 发送消息 socket.send('Hello, server!'); ``` 以上是集成WebSocket的基本步骤。你可以根据实际需求进行进一步的配置和扩展。希望对你有所帮助!
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值