1. 程式人生 > >spring boot 開發—第九篇整合websocket

spring boot 開發—第九篇整合websocket

1、websocket簡介

1.1、WebSocket 是什麼?

WebSocket 是一種網路通訊協議。RFC6455 定義了它的通訊標準。

WebSocket 是 HTML5 開始提供的一種在單個 TCP 連線上進行全雙工通訊的協議。

1.2、為什麼需要WebSocket?

HTTP 協議是一種無狀態的、無連線的、單向的應用層協議。它採用了請求/響應模型。通訊請求只能由客戶端發起,服務端對請求做出應答處理。

這種通訊模型有一個弊端:HTTP 協議無法實現伺服器主動向客戶端發起訊息。

這種單向請求的特點,註定瞭如果伺服器有連續的狀態變化,客戶端要獲知就非常麻煩。大多數 Web 應用程式將通過頻繁的非同步JavaScript和XML(AJAX)請求實現長輪詢。輪詢的效率低,非常浪費資源(因為必須不停連線,或者 HTTP 連線始終開啟)。

WebSocket 就是這樣發明的。WebSocket 連線允許客戶端和伺服器之間進行全雙工通訊,以便任一方都可以通過建立的連線將資料推送到另一端。WebSocket 只需要建立一次連線,就可以一直保持連線狀態。這相比於輪詢方式的不停建立連線顯然效率要大大提高。

2、構建工程

2.1、在pom中新增websocket的依賴

<!-- 引入 websocket 依賴類-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2.2、建立請求訊息實體

package com.vesus.springbootwebsocket.model;

/**
 * @Description:
 * @Author: vesus
 * @CreateDate: 2018/5/28 下午5:46
 * @Version: 1.0
 */
public class RequestMessage {

    /***
     * 請求訊息
     */
    private String message ;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

2.3、建立響應訊息實體

package com.vesus.springbootwebsocket.model;

/**
 * @Description:
 * @Author: vesus
 * @CreateDate: 2018/5/28 下午5:47
 * @Version: 1.0
 */
public class ResponseMessage {

    /**
     * 響應訊息
     */
    private String message ;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

2.4、配置訊息代理

package com.vesus.springbootwebsocket.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;

/**
 * @Description:
 * @Author: vesus
 * @CreateDate: 2018/5/29 上午10:41
 * @Version: 1.0
 */
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    /***
     * 註冊 Stomp的端點
     * addEndpoint:新增STOMP協議的端點。提供WebSocket或SockJS客戶端訪問的地址
     * withSockJS:使用SockJS協議
     * @param registry
     */
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/api/v1/socket")
                .setAllowedOrigins("*")//新增允許跨域訪問
                .withSockJS() ;
    }

    /**
     * 配置訊息代理
     * 啟動Broker,訊息的傳送的地址符合配置的字首來的訊息才傳送到這個broker
     */
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/api/v1/socket/send");//推送訊息字首
        registry.setApplicationDestinationPrefixes("/api/v1/socket/req");//應用請求字首
        registry.setUserDestinationPrefix("/user");//推送使用者字首
    }

}

2.5、控制器

package com.vesus.springbootwebsocket.controller;

import com.vesus.springbootwebsocket.model.RequestMessage;
import com.vesus.springbootwebsocket.model.ResponseMessage;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.annotation.Resource;

/**
 * @Description:
 * @Author: vesus
 * @CreateDate: 2018/5/29 下午1:48
 * @Version: 1.0
 */
@Controller
public class WebSocketController {

    @Resource
    private SimpMessagingTemplate messagingTemplate ;

    @RequestMapping("/index")
    public String index(){
        return "index";
    }

    @MessageMapping("/welcome")
    public ResponseMessage toTopic(RequestMessage msg) throws Exception
    {
        System.out.println("======================"+msg.getMessage());
        this.messagingTemplate.convertAndSend("/api/v1/socket/send",msg.getMessage());
        return new ResponseMessage("歡迎使用webScoket:"+msg.getMessage());
    }

    @MessageMapping("/message")
    public ResponseMessage toUser(RequestMessage msg ) {
        System.out.println(msg.getMessage());
        this.messagingTemplate.convertAndSendToUser("123","/message",msg.getMessage());
        return new ResponseMessage("歡迎使用webScoket:"+msg.getMessage());
    }
}

2.6、前端html

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>WebScoket廣播式</title>
    <script src="/sockjs.js"></script>
    <script src="/stomp.js"></script>
    <script src="/jquery.js"></script>
</head>
<body onload="disconnect()">
<button id="connect" onclick="connect()">連線</button>
<button id="disconnect" onclick="disconnect()" disabled="disabled">斷開連線</button><br/>
<div id="inputDiv">
    輸入名稱:<input type="text" id="name"/><br/>
    <button id="sendName" onclick="sendName()">傳送</button><br/>
    <p id="response"></p>
</div>
<script>
    var stompClient = null;
    //設定連線狀態控制顯示隱藏
    function setConnected(connected)
    {
        $("#connect").attr("disabled",connected);
        $("#disconnect").attr("disabled",!connected);
        if(!connected) {
            $("#inputDiv").hide();
        }else{
            $("#inputDiv").show();
        }
        $("#reponse").html("");
    }
    //連線
    function connect()
    {
        var socket = new SockJS("/api/v1/socket");
        stompClient = Stomp.over(socket);
        stompClient.connect({},function (frame) {
            setConnected(true);
            console.log("connected : "+frame);
            stompClient.subscribe("/api/v1/socket/send",function (response) {
                showResponse(JSON.parse(response.body));
            })
        })
    }
    //斷開連線
    function disconnect(){
        if(stompClient!=null)
        {
            stompClient.disconnect();
        }
        setConnected(false);
        console.log("disconnected!");
    }
    //傳送名稱到後臺
    function sendName(){
        var name = $("#name").val();
        stompClient.send("/api/v1/socket/req/message",{},JSON.stringify({'message':name}));
    }
    //顯示socket返回訊息內容
    function showResponse(message)
    {
        $("#response").html(message);
    }
</script>
</body>
</html>

相關推薦

spring boot 開發整合websocket

1、websocket簡介 1.1、WebSocket 是什麼? WebSocket 是一種網路通訊協議。RFC6455 定義了它的通訊標準。 WebSocket 是 HTML5 開始提供的一種在單個 TCP 連線上進行全雙工通訊的協議。 1.2、為什麼

spring boot 開發整合OAuth2保證api介面安全

1、 OAuth 概念 OAuth 是一個開放標準,允許使用者讓第三方應用訪問該使用者在某一網站上儲存的私密的資源(如照片,視訊,聯絡人列表),而不需要將使用者名稱和密碼提供給第三方應用。OAuth允許使用者提供一個令牌,而不是使用者名稱和密碼來訪問他

spring boot 開發SpringDataJPA整合 Redis 實現快取

對druid專案進行改造,增加redis快取支援。 1、redis簡介 Redis 是完全開源免費的,遵守BSD協議,是一個高效能的key-value資料庫。 Redis 與其他 key - value 快取產品有以下三個特點: Redis支援資料

spring boot 開發使用JWT保證api介面安全

1、jwt簡介 JWT是一種用於雙方之間傳遞安全資訊的簡潔的、URL安全的表述性宣告規範。JWT作為一個開放的標準(RFC 7519),定義了一種簡潔的,自包含的方法用於通訊雙方之間以Json物件的形式安全的傳遞資訊。因為數字簽名的存在,這些資訊是可信的,JW

spring boot 開發修改tomcat容器上下文根地址

1、上下文跟預設地址 預設情況下springboot中request.getServletContext().getRealPath 返回的是一個臨時資料夾的地址 2、檢視原始碼 通過檢視原始碼 位置在org.springframework.boot.co

Spring Cloud實戰 | Spring Cloud整合Spring Security OAuth2認證伺服器統一認證自定義異常處理

[本文完整程式碼下載點選](https://github.com/hxrui/youlai-mall.git) # 一. 前言 相信瞭解過我或者看過我之前的系列文章應該多少知道點我寫這些文章包括建立 [有來商城youlai-mall](https://github.com/hxrui/youlai

spring boot實戰(番外)整合RabbitMQ

前言 最近幾篇文章將圍繞訊息中介軟體RabbitMQ展開,對於RabbitMQ基本概念這裡不闡述,主要講解RabbitMQ的基本用法、Java客戶端API介紹、spring Boot與RabbitMQ整合、 Spring Boot與RabbitMQ整合原始碼分析。  

spring boot實戰()Spring boot Bean載入原始碼分析

public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostPro

spring-boot-json()

本文介紹spring-boot返回json格式資料,通過fastjson轉化。1、開發準備Ø  開發環境jdk1.7或者1.8Ø  開發工具EeclipseØ  專案管理工具maven2、建立工作空間使用idea建立一個module, idea中module相當於eclips

安卓開發 多個專案共用模組

最近忙新專案的事情,都沒有時間寫博文了,慚愧慚愧,今天抽得浮生半日閒,就來一篇吧。 我們在開發中可能會遇到同時開發幾個app的情況,而這幾個app在某些地方是相同的,而我們通常的做法是將相同的部分抽成一個library。這在eclipse中是很好實現的,而在A

spring boot實戰()上下文的建立

public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors( BeanDefinitionRegistry registry, Object source) { DefaultListableBe

spring-boot-route(整合JPA操作資料庫

單調的增刪改查讓越來越多的程式設計師感到乏味,這時候就出現了很多優秀的框架,完成了對增刪改查操作的封裝,只需要簡單配置,無需書寫任何sql,就可以完成增刪改查。這裡比較推薦的是Spring Data Jpa。 Spring Data JPA是Spring Data家族的一部分,可以輕鬆實現基於JPA的儲存庫

Spring Boot整合RabbitMQ

RabbitMQ是一個開源的訊息代理和佇列伺服器,用來通過普通協議在完全不同的應用之間共享資料,或者簡單地將作業佇列以便讓分散式伺服器進行處理。訊息佇列使用訊息將應用程式連線起來,這些訊息通過像RabbitMQ這樣的訊息代理伺服器在應用程式之間路由。這篇文章將帶你瞭解怎麼整合Rabbit

: 用spring boot整合swagger2建立API文件

簡介: Swagger的目標是為REST APIs 定義一個標準的,與語言無關的介面,使人和計算機在看不到原始碼或者看不到文件或者不能通過網路流量檢測的情況下能發現和理解各種服務的功能。當服務通過Swagger定義,消費者就能與遠端的服務互動通過少量的實現邏輯。類似於低階程

spring boot實戰(十二)整合RabbitMQ

this direct 還需要 添加屬性 創建 還需 topic start routing 前言 本篇主要講述Spring Boot與RabbitMQ的整合,內容非常簡單,純API的調用操作。 操作之間需要加入依賴Jar [html] view plain cop

spring boot實戰(十四)整合RabbitMQ原始碼分析前言

public void afterPropertiesSet() { synchronized (this.lifecycleMonitor) { if (this.running || !this.autoStartup) { return; } if (this.con

SpringBoot整合Spring Data JPA

作者:追夢1819 原文:https://www.cnblogs.com/yanfei1819/p/10910059.html 版權宣告:本文為博主原創文章,轉載請附上博文連結! 前言   前面幾章,我們介紹了 JDBCTemplate、MyBatis 等 ORM 框架。下面我們來介紹極簡模式的 Sprin

python全棧開發】Python常用模塊一(主要是re正則和collections)

順序 常用模塊 內置 object 簡潔 整體 re.search lec 快速 一、認識模塊    什麽是模塊:一個模塊就是一個包含了python定義和聲明的文件,文件名就是加上.py的後綴,但其實import加載的模塊分為四個通用類別 :     1.使用python

業余草 SpringCloud教程 | : 服務鏈路追蹤(Spring Cloud Sleuth)(Finchley版本)

描述 -s util ont packaging tdd res [] 新建 這篇文章主要講述服務追蹤組件zipkin,Spring Cloud Sleuth集成了zipkin組件。 一、簡介 Add sleuth to the classpath of a Spr

Spring的applicationContext.xml配置總結

在前面的一篇日誌中,記錄了web.xml配置啟動的順序,web啟動到監聽器ContextLoaderListener時,開始載入spring的配置檔案applicationContext.xml(通常就叫這個名字),在查詢大量資料之後決心將該檔案詳細的配置說明和講解記錄下來,以供查閱,加深原理的理解。&nbs