国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java】SpringBoot快速整合WebSocket實現(xiàn)客戶端服務端相互推送信息

這篇具有很好參考價值的文章主要介紹了【Java】SpringBoot快速整合WebSocket實現(xiàn)客戶端服務端相互推送信息。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

什么是webSocket?

webSocket可以用來做什么?

WebSocket操作類

一:測試客戶端向服務端推送消息

1.啟動SpringBoot項目

2.打開網(wǎng)站

3.進行測試消息推送

4.后端進行查看測試結(jié)果

二:測試服務端向客戶端推送消息

1.接口代碼

2.使用postman進行調(diào)用

3.查看測試結(jié)果


什么是webSocket?

????????WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議。WebSocket使得客戶端和服務器之間的數(shù)據(jù)交換變得更加簡單,允許服務端主動向客戶端推送數(shù)據(jù)。而Http請求只能從客戶端請求服務端才能得到響應。在WebSocket API中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進行雙向數(shù)據(jù)傳輸。

webSocket可以用來做什么?

????????利用雙向數(shù)據(jù)傳輸?shù)奶攸c可以用來完成很多功能,不需要前端輪詢,浪費資源。例如:
聊天功能、數(shù)據(jù)實時更新和視頻彈幕等

webSocket協(xié)議
本協(xié)議有兩部分:握手和數(shù)據(jù)傳輸。
握手是基于http協(xié)議的。

來自客戶端的握手看起來像如下形式:

GET ws://localhost/chat HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Protocol: chat,superchat
Sec-WebSocket-Version: 13

來自服務器的握手看起來像如下形式


HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

SpringBoot快速整合WebSocket代碼案例:

下面我就使用SpringBoot快速整合WebSocket實現(xiàn)服務端與客戶端的相互推送消息;

代碼層級結(jié)構(gòu)

【Java】SpringBoot快速整合WebSocket實現(xiàn)客戶端服務端相互推送信息,Java,spring boot,websocket,后端
maven依賴

     <!--WebSocket的依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

WebSocket配置類

package com.example.springboot_websocket_demo01;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
    /**
     *   注入ServerEndpointExporter,
     *   這個bean會自動注冊使用了@ServerEndpoint注解聲明的Websocket endpoint
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
    
}

WebSocket操作類

通過該類WebSocket可以進行群推送以及單點推送

package com.example.springboot_websocket_demo01;

import jakarta.websocket.*;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;

@Component
@Slf4j
@ServerEndpoint("/websocket/{userId}")  // 接口路徑 ws://localhost:8087/webSocket/userId;
public class WebSocket {

    //與某個客戶端的連接會話,需要通過它來給客戶端發(fā)送數(shù)據(jù)
    private Session session;
    /**
     * 用戶ID
     */
    private String userId;

    //concurrent包的線程安全Set,用來存放每個客戶端對應的MyWebSocket對象。
    //雖然@Component默認是單例模式的,但springboot還是會為每個websocket連接初始化一個bean,所以可以用一個靜態(tài)set保存起來。
    //  注:底下WebSocket是當前類名
    private static CopyOnWriteArraySet<WebSocket> webSockets = new CopyOnWriteArraySet<>();
    // 用來存在線連接用戶信息
    private static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<String, Session>();

    /**
     * 鏈接成功調(diào)用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam(value = "userId") String userId) {
        try {
            this.session = session;
            this.userId = userId;
            webSockets.add(this);
            sessionPool.put(userId, session);
            log.info("【websocket消息】有新的連接,總數(shù)為:" + webSockets.size());
        } catch (Exception e) {
        }
    }

    /**
     * 鏈接關閉調(diào)用的方法
     */
    @OnClose
    public void onClose() {
        try {
            webSockets.remove(this);
            sessionPool.remove(this.userId);
            log.info("【websocket消息】連接斷開,總數(shù)為:" + webSockets.size());
        } catch (Exception e) {
        }
    }

    /**
     * 收到客戶端消息后調(diào)用的方法
     *
     * @param message
     */
    @OnMessage
    public void onMessage(String message) {
        log.info("【websocket消息】收到客戶端消息:" + message);
    }

    /**
     * 發(fā)送錯誤時的處理
     *
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("用戶錯誤,原因:" + error.getMessage());
        error.printStackTrace();
    }

    // 此為廣播消息
    public void sendAllMessage(String message) {
        log.info("【websocket消息】廣播消息:" + message);
        for (WebSocket webSocket : webSockets) {
            try {
                if (webSocket.session.isOpen()) {
                    webSocket.session.getAsyncRemote().sendText(message);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // 此為單點消息
    public void sendOneMessage(String userId, String message) {
        Session session = sessionPool.get(userId);
        if (session != null && session.isOpen()) {
            try {
                log.info("【websocket消息】 單點消息:" + message);
                session.getAsyncRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // 此為單點消息(多人)
    public void sendMoreMessage(String[] userIds, String message) {
        for (String userId : userIds) {
            Session session = sessionPool.get(userId);
            if (session != null && session.isOpen()) {
                try {
                    log.info("【websocket消息】 單點消息:" + message);
                    session.getAsyncRemote().sendText(message);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

    }

}

注意:WebSocketConfig和WebSocket必須放在同一層級下,否則Websocket掃描不到ServerEndpoint注解。

一:測試客戶端向服務端推送消息

1.啟動SpringBoot項目

【Java】SpringBoot快速整合WebSocket實現(xiàn)客戶端服務端相互推送信息,Java,spring boot,websocket,后端

2.打開網(wǎng)站

WebSocket測試 devTest.run

輸入

ws://127.0.0.1:8080/websocket/100

進行連接,測試是否連接成功

【Java】SpringBoot快速整合WebSocket實現(xiàn)客戶端服務端相互推送信息,Java,spring boot,websocket,后端

3.進行測試消息推送

【Java】SpringBoot快速整合WebSocket實現(xiàn)客戶端服務端相互推送信息,Java,spring boot,websocket,后端

4.后端進行查看測試結(jié)果

【Java】SpringBoot快速整合WebSocket實現(xiàn)客戶端服務端相互推送信息,Java,spring boot,websocket,后端

測試成功,說明客戶端可以使用WebSocket對服務端推送消息。

二:測試服務端向客戶端推送消息

1.接口代碼

package com.example.springboot_websocket_demo01;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class YourController {

    @Autowired
    private WebSocket webSocket;

    @PostMapping("/sendNotification")
    public void sendNotification() {
        try {
            // 創(chuàng)建業(yè)務消息信息
            String message = "postman調(diào)用接口訪問后端服務器存儲數(shù)據(jù)并使用websocket將消息推送給前端客戶端";

            // 全體發(fā)送
            webSocket.sendAllMessage(message);

            // 單個用戶發(fā)送 (userId為用戶id)
            String userId = "1";

            String message1 = "【websocket消息】 單點消息:只發(fā)送給id為"+userId+"的用戶。";
            webSocket.sendOneMessage(userId, message1);

            // 多個用戶發(fā)送 (userIds為多個用戶id,逗號‘,’分隔)
            String[] userIds = {"1", "2"};
            String message2 = "【websocket消息】 單點消息:只發(fā)送給id為"+userIds.toString()+"的用戶。";
            webSocket.sendMoreMessage(userIds, message2);
        } catch (Exception e) {
            // 輸出異常信息
            e.printStackTrace();
        }
    }

}

2.使用postman進行調(diào)用

用來模仿客戶端發(fā)送消息到后端服務器然后返回給客戶端。(其實也可以直接在WebSocket類中的onMessage中直接進行操作,調(diào)用sendAllMessage等其他方法進行測試);

【Java】SpringBoot快速整合WebSocket實現(xiàn)客戶端服務端相互推送信息,Java,spring boot,websocket,后端

3.查看測試結(jié)果

WebSocket測試 devTest.run

正常結(jié)果為

【Java】SpringBoot快速整合WebSocket實現(xiàn)客戶端服務端相互推送信息,Java,spring boot,websocket,后端

【Java】SpringBoot快速整合WebSocket實現(xiàn)客戶端服務端相互推送信息,Java,spring boot,websocket,后端

【Java】SpringBoot快速整合WebSocket實現(xiàn)客戶端服務端相互推送信息,Java,spring boot,websocket,后端

還有很多測試方法,自己可以去思考,以上對于SpringBoot整合WebSocket來說可以算是一個簡單的入門案例了。文章來源地址http://www.zghlxwxcb.cn/news/detail-808247.html

到了這里,關于【Java】SpringBoot快速整合WebSocket實現(xiàn)客戶端服務端相互推送信息的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • solr快速上手:整合SolrJ實現(xiàn)客戶端操作(九)

    solr快速上手:整合SolrJ實現(xiàn)客戶端操作(九)

    我們前面學習了solr的服務端基礎操作,實際項目中我們還需要在客戶端調(diào)用solr,就像調(diào)用數(shù)據(jù)庫一樣,我們可以基于 solrJ 來實現(xiàn)對solr的客戶端操作 SolrJ 是 Solr官方提供的 Java 客戶端庫,主要用于與 Solr 服務器進行交互。內(nèi)部封裝了一組API,可以方便地實現(xiàn)對solr服務端的各

    2024年02月10日
    瀏覽(26)
  • SpringBoot集成WebSocket實現(xiàn)客戶端與服務端通信

    SpringBoot集成WebSocket實現(xiàn)客戶端與服務端通信

    話不多說,直接上代碼看效果! 一、服務端: 1、引用依賴 2、添加配置文件 WebSocketConfig 3、編寫WebSocket服務端接收、發(fā)送功能 ? 聲明接口代碼: ? 實現(xiàn)類代碼: 4、如果不需要實現(xiàn)客戶端功能,此處可選擇前端調(diào)用,奉上代碼 二、客戶端: 1、引用依賴 2、自定義WebSocket客

    2024年01月23日
    瀏覽(24)
  • websocket客戶端實現(xiàn)(java)

    其中,headers 參數(shù)是一個鍵值對,表示需要設置的請求頭。在構(gòu)造函數(shù)中,我們首先創(chuàng)建了一個 ClientEndpointConfig.Configurator 對象,重寫了其中的 beforeRequest() 方法,用于在請求之前設置請求頭。然后,我們使用 ClientEndpointConfig.Builder.create() 方法創(chuàng)建一個 ClientEndpointConfig 對象,并

    2024年02月15日
    瀏覽(26)
  • Java實現(xiàn)websocket客戶端

    常規(guī)情況下,大多數(shù)時候Java后臺作為websocket服務端,實現(xiàn)方式也比較簡單,網(wǎng)上很多案例代碼。但是很多時候項目中服務與服務之間也需要使用websocket通信,此時項目就需要實現(xiàn)客戶端功能。 步驟一:導入依賴: 步驟二:實現(xiàn)WebSocketClient抽象類: 該類中和websocket服務端接口

    2024年02月16日
    瀏覽(86)
  • SpringBoot集成WebSocket實現(xiàn)客戶端與服務端長連接通信

    SpringBoot集成WebSocket實現(xiàn)客戶端與服務端長連接通信

    場景: 1、WebSocket協(xié)議是用于前后端長連接交互的技術(shù),此技術(shù)多用于交互不斷開的場景。特點是連接不間斷、更輕量,只有在關閉瀏覽器窗口、或者關閉瀏覽器、或主動close,當前會話對象才會關閉。 2、相較于 Http/Https?通信只能由客戶端主動發(fā)起請求,而 Socket?通信不僅能

    2024年02月02日
    瀏覽(29)
  • JAVA使用WebSocket實現(xiàn)多客戶端請求

    工作前提:兩個服務之間實現(xiàn)聊天通訊,因為介于兩個服務,兩個客戶端 方案1:多個服務端,多個客戶端,使用redis把用戶數(shù)據(jù)ip進行存儲,交互拿到redis數(shù)據(jù)進行推送 方案2: 一個服務端,多個客戶端,拿到客戶端的id和需要推送的id進行拼接存儲 此文章使用的是方案2 1. 引

    2024年02月11日
    瀏覽(17)
  • java實現(xiàn)WebSocket客戶端&&斷線重連機制

    1、引入maven依賴(注意版本) 2、代碼

    2024年02月16日
    瀏覽(25)
  • Java實現(xiàn)WebSocket客戶端和服務端(簡單版)

    Java實現(xiàn)WebSocket客戶端和服務端(簡單版)

    天行健,君子以自強不息;地勢坤,君子以厚德載物。 每個人都有惰性,但不斷學習是好好生活的根本,共勉! 文章均為學習整理筆記,分享記錄為主,如有錯誤請指正,共同學習進步。 寫在前面: WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議。 WebSocket通信協(xié)議于

    2024年02月08日
    瀏覽(35)
  • netty學習(3):SpringBoot整合netty實現(xiàn)多個客戶端與服務器通信

    netty學習(3):SpringBoot整合netty實現(xiàn)多個客戶端與服務器通信

    創(chuàng)建一個SpringBoot工程,然后創(chuàng)建三個子模塊 整體工程目錄:一個server服務(netty服務器),兩個client服務(netty客戶端) pom文件引入netty依賴,springboot依賴 NettySpringBootApplication NettyServiceHandler SocketInitializer NettyServer NettyStartListener application.yml Client1 NettyClientHandler SocketInitializ

    2024年02月11日
    瀏覽(56)
  • java后端使用websocket實現(xiàn)與客戶端之間接收及發(fā)送消息

    客戶端請求websocket接口,連接通道=》我這邊業(yè)務成功客戶端發(fā)消息=》客戶端自動刷新。 接口:ws://localhost:8080/websocket/xx 經(jīng)測試,成功 如果是線上服務器連接,則需要在nginx里配置websocket相關內(nèi)容,再重啟nginx,代碼如下 本地連接的時候用的是ws://,因為是http鏈接,但是如果是

    2024年02月16日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包