在spring boot中使用webSocket組件(一)

最近在項目中使用到了spring的webSocket組件,在這裏和你們分享下,若有錯誤,歡迎你們指正。javascript

在這裏我使用的IDE工具是Intellij idea,框架是spring boot。spring boot的主要功能是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員再也不須要定義樣板化的配置。(簡單點講就是幫你整合好了框架,不用本身搭建了,不用再寫xml配置文件了!!!)html

一,首先先搭建spring boot的框架,如圖:File-->New-->Project,前端

而後會進入如下頁面,選擇左邊的Spring Initiailzr,而後nextjava

下圖,用來編輯本身項目的一些信息,能夠根據本身的需求進行編輯,而後nextjquery

下圖,用來選擇spring boot的一些服務,咱們這裏選擇(websocket和Thymeleaf),web

在這裏選擇什麼組件,spring boot就會幫你下載對應的jar包,是否是很方便啊。spring

Thymeleaf是一個JAVA庫,一個XML/XHTML/HTML5的可擴展的模板引擎,而且它能夠在WEB和非WEB環境下運行。瀏覽器

(在本人使用Thymeleaf的過程當中感受功能相似JSP中的EL表達式,可能更增強大,將在下次進行講解)服務器

下圖,填寫項目名和項目存放路徑,而後finishwebsocket

二,spring boot環境搭建好後,開始寫代碼!!

1.首先先加入三個JS,如圖:

2.建立WebSocketConfig類,代碼以下:

package com.wisely.ch7_6;

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//1
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer{
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/endpointWisely").withSockJS(); //2
    }
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");//3
    }
}

(1),@EnableWebSocketMessageBroker註解用於開啓使用STOMP協議來傳輸基於代理(MessageBroker)的消息,這時候控制器(controller)開始支持@MessageMapping,就像是使用@requestMapping同樣。

(2),註冊一個Stomp的節點(endpoint),並指定使用SockJS協議。

(3),配置消息代理(MessageBroker)。

3.建立WiselyMessage類(瀏覽器向服務器傳送消息,用該類進行接收),代碼以下:

package com.wisely.ch7_6.domain;

public class WiselyMessage {
    private String name;
    public String getName(){
        return name;
    }
}

4.建立WiselyResponse類(服務器向瀏覽器傳送消息,用該類進行傳送),代碼以下:

package com.wisely.ch7_6.domain;

public class WiselyResponse {
    private String responseMessage;
    public WiselyResponse(String responseMessage){
        this.responseMessage = responseMessage;
    }
    public String getResponseMessage(){
        return responseMessage;
    }
}

5.建立WsController類,代碼以下:

@Controller
public class WsController {
    @MessageMapping("/welcome")//1
    @SendTo("/topic/getResponse")//2
    public WiselyResponse say(WiselyMessage message) throws Exception {
        return new WiselyResponse("Welcome, " + message.getName() + "!");
    }
}

(1)@MessageMapping和@RequestMapping功能相似,用於設置URL映射地址,瀏覽器向服務器發起請求,須要經過該地址。

(2)若是服務器接受到了消息,就會對訂閱了@SendTo括號中的地址傳送消息。

6.建立前端頁面ws.html,代碼以下:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8" />
    <title>Spring Boot+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('/endpointWisely'); //1
        stompClient = Stomp.over(socket);//2
        stompClient.connect({}, function(frame) {//3
            setConnected(true);
            console.log('開始進行鏈接Connected: ' + frame);
            stompClient.subscribe('/topic/getResponse', function(respnose){ //4
                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 }));//5
    }

    function showResponse(message) {
          var response = $("#response");
          response.html(message);
    }
</script>
</body>
</html>

 

(1)鏈接SockJS的endpoint是「endpointWisely」,與後臺代碼中註冊的endpoint要同樣。

(2)建立STOMP協議的webSocket客戶端。

(3)鏈接webSocket的服務端。

(4)經過stompClient.subscribe()訂閱服務器的目標是'/topic/getResponse'發送過來的地址,與@SendTo中的地址對應。

(5)經過stompClient.send()向地址爲"/welcome"的服務器地址發起請求,與@MessageMapping裏的地址對應。

7.建立WebMvcConfig類(該類的做用是能夠爲ws.html提供便捷的地址映射,只須要在地址欄裏面輸入localhost:8080/ws,就會找到ws.html),代碼以下:

package com.wisely.ch7_6;

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) {
           registry.addViewController("/ws").setViewName("/ws");
       }
}

 8.而後點擊啓動按鈕就能夠了(紅色箭頭所指),如圖:

9.瀏覽器連開三個頁面,如圖所示:

10.隨意使用其中一個頁面進行消息的發送,其它兩個頁面都會接受到發送的消息,如圖所示:

到此爲止,websocket的廣播式發送演示完畢,若有錯誤,歡迎你們指正。(下篇將演示websocket如何向特定目標發送消息,相似聊天室)

相關文章
相關標籤/搜索