Spring Boot + WebSocket(广播的方式发送消息)

使用广播的方式,该方式将消息发送给所有连接了当前endpoint的浏览器

1.添加websocket依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2.配置WebSocket,需要在配置类上使用@EnableWebSocketMessageBroker注解开启WebSocket支持,并通过实现WebSocketMessageBrokerConfigurer接口的registerStompEndpoints和configureMessageBroker完成WebSocket配置
@Configuration
@EnableWebSocketMessageBroker//开启使用STOMP协议来传输基于代理(message broker)的消息
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    //注册STOMP协议的节点(endPoint),并映射指定的URL
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry){
        registry.addEndpoint("/endpoint").withSockJS();//注册一个STOMP的endpoint,并指定SockJS协议
    }

    //配置消息代理(Message Broker)
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry){
        registry.enableSimpleBroker("/topic");
    }

}
3.浏览器向服务端发送消息的实体类
public class SendMessageBean {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
4.服务端向浏览器发送信息的实体类
public class ReceiveMessageBean {
    private String responseMessage;

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

    public String getResponseMessage() {
        return responseMessage;
    }

    public void setResponseMessage(String responseMessage) {
        this.responseMessage = responseMessage;
    }
}
5.控制器
@Controller
public class WsController {

    @MessageMapping("/welcome") //浏览器向服务端发送请求时,通过这个映射,相当于@RequestMapping
    @SendTo("/topic/getResponse") //当服务端有消息时,会对订阅了@SendTo中的路径的浏览器发送消息
    public ReceiveMessageBean say(SendMessageBean message) throws Exception{
        return new ReceiveMessageBean("hello," + message.getName() + "!");
    }

}
6.演示页面(该页面用到了thymeleaf模版,所以需要引入该模版依赖)
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
页面
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8" />
    <title>WebSocket广播式</title>

</head>
<body onload="disconnect()">
<noscript><h2 style="color: #ff0000">您的浏览器不支持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 th:src="@{sockjs.min.js}"></script>
<script th:src="@{stomp.min.js}"></script>
<script th:src="@{jquery.js}"></script>
<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('/endpoint'); //连接SockJS的endpoint名称为"/endpoint"
        stompClient = Stomp.over(socket);//使用STOMP子协议的WebSocket客户端
        stompClient.connect({}, function(frame) {//连接WebScoket服务端
            setConnected(true);
            console.log('Connected: ' + frame);
            stompClient.subscribe('/topic/getResponse', function(respnose){ //订阅消息
                showResponse(JSON.parse(respnose.body).responseMessage);
            });
        });
    }
	
	
    function disconnect() {
        if (stompClient != null) {
            stompClient.disconnect();
        }
        setConnected(false);
        console.log("Disconnected");
    }

    function sendName() {
        var name = $('#name').val();
        stompClient.send("/welcome", {}, JSON.stringify({ 'name': name }));//发送消息
    }

    function showResponse(message) {
          var response = $("#response");
          response.html(message);
    }
</script>
</body>
</html>
7.该页面需要的js

链接: https://pan.baidu.com/s/1LC1JNdm-R9yU49GIGm4M1w
密码: l808

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个简单的 Spring Boot 集成 WebSocket 实现对话功能的 Demo,你可以参考一下。 首先,我们需要在 pom.xml 文件中添加 WebSocketSpring Web 依赖: ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> ``` 接下来,我们需要创建一个 WebSocket 配置类,用于注册 WebSocket 终端点和处理器: ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new ChatWebSocketHandler(), "/chat").setAllowedOrigins("*"); } } ``` 在上面的代码中,我们注册了一个名为 ChatWebSocketHandler 的 WebSocket 处理器,并将其映射到路径 /chat。同时,我们通过 setAllowedOrigins 方法允许来自任何来源的 WebSocket 连接。 接下来,我们需要定义 WebSocket 处理器 ChatWebSocketHandler: ```java public class ChatWebSocketHandler extends TextWebSocketHandler { private final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { sessions.add(session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { for (WebSocketSession s : sessions) { if (s.isOpen()) { s.sendMessage(message); } } } } ``` 在上面的代码中,我们定义了一个名为 sessions 的列表,用于存储所有 WebSocket 连接的会话。在 afterConnectionEstablished 方法中,我们将新连接的会话添加到 sessions 列表中。在 handleTextMessage 方法中,我们将接收到的消息广播给所有连接的会话。 最后,我们需要创建一个简单的 HTML 页面,用于测试 WebSocket 连接: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>WebSocket Test</title> </head> <body> <input type="text" id="message"> <button onclick="send()">Send</button> <div id="output"></div> <script> var socket = new WebSocket("ws://" + window.location.hostname + ":8080/chat"); socket.onmessage = function(event) { var output = document.getElementById("output"); output.innerHTML += event.data + "<br>"; }; function send() { var message = document.getElementById("message").value; socket.send(message); } </script> </body> </html> ``` 在上面的代码中,我们使用 JavaScript 创建一个 WebSocket 连接,并将其连接到 ChatWebSocketHandler 处理器。我们还创建了一个文本框和一个按钮,用于发送消息。每当接收到一条消息时,我们将其添加到名为 output 的 div 中。 这就是一个简单的 Spring Boot 集成 WebSocket 实现对话功能的 Demo。你可以使用浏览器打开 HTML 页面,测试 WebSocket 连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值