SpringBoot之WebSocket练习

  1. 准备:
    IDE:Intelijj IDEA
    所需js:sockjs.min.js(SockJS的客户端脚本)+stomp.min.js(STOMP协议的客户端脚本)
    stomp.min.js:https://github.com/plusjade/jekyll-bootstrap.git
    sockjs.min.js:https://github.com/sockjs/sockjs-client.git

  2. 开始:
    idea下新建 Spring Initializr项目,勾选Web+Thymlead+Websocket依赖。
    项目结构如下图所示:
    这里写图片描述
    (1)新建WebSocket的配置类-WebSocketConfig,需要在配置类上使用@Configuration
    @EnableWebSocketMessageBroker
    注解,其中@EnableWebSocketMessageBroker用来开启WebSocket支持。代码如下:

package com.example.demo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    //注册STOMP协议的节点,并映射到指定的url
    public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
        //注册一个STOMP的endpoint,并指定使用SockJS协议
        stompEndpointRegistry.addEndpoint("/endpoint").withSockJS();
    }

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

(2)新建消息类-Message,接受来自浏览器的消息,代码如下:

package com.example.demo.bean;
//用作接受浏览器消息的参数,用次类接收来自浏览器的消息
public class Message {
    private String name;
    public String getName() {
        return name;
    }
}

(3)SocketResponse

package com.example.demo.bean;

public class SocketResponse {
    private String responseMessage;
    public SocketResponse(String responseMessage){
        this.responseMessage=responseMessage;
    }

    public String getResponseMessage() {
        return responseMessage;
    }
}

(4)ScoketController

package com.example.demo.controller;

import com.example.demo.bean.SocketResponse;
import com.example.demo.bean.Message;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

@Controller
public class SocketController {
    @MessageMapping("/welcome")
    @SendTo("/topic/getResponse")
    public SocketResponse say(Message msg) throws Exception{
        Thread.sleep(3000);
        return  new SocketResponse("Welcome,"+msg.getName()+"!");
    }
}

ws.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</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-3.2.1.min.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) {//连接WebSocket服务端
            setConnected(true);
            console.log('Connected:'+frame);
            stompClient.subscribe('/topic/getResponse',function (response) {
                //通过stompClient.subscribe订阅/topic/getResponse目标发送的消息,这个是在控制器的@SendTO中定义的
                showResponse(JSON.parse(response.body).responseMessage);
            })
        })
    }
    function disconnect() {
        if(stompClient!=null){
            stompClient.disconnect();
        }
        setConnected(false);
        console.log('Disconnected');
    }
    function sendName() {
        var name=$("#name").val();
       // alert(name);
        //通过stompClient.send向/welcome目标发送消息,这个实在控制器@MessageMapping中定义的
        stompClient.send("/welcome",{},JSON.stringify({'name':name}));
    }
    function showResponse(message) {
        var response=$("#response");
        response.html(message);
    }
</script>
</body>
</html>

(7)WebMvcConfig

package com.example.demo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter{
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
//        super.addViewControllers(registry);
        registry.addViewController("/ws").setViewName("/ws");
    }
}

(8)运行结果
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值