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

快速搭建springboot websocket客戶端

這篇具有很好參考價(jià)值的文章主要介紹了快速搭建springboot websocket客戶端。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、前言

WebSocket 是 HTML5 開始提供的一種在單個(gè) TCP 連接上進(jìn)行全雙工通訊的協(xié)議。

HTML5 定義的 WebSocket 協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬,并且能夠更實(shí)時(shí)地進(jìn)行通訊。

HTML5 定義的 WebSocket 協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬,并且能夠更實(shí)時(shí)地進(jìn)行通訊。

瀏覽器通過(guò) JavaScript 向服務(wù)器發(fā)出建立 WebSocket 連接的請(qǐng)求,連接建立以后,客戶端和服務(wù)器端就可以通過(guò) TCP 連接直接交換數(shù)據(jù)。

二、快速搭建springboot-websocket項(xiàng)目的服務(wù)端

1 導(dǎo)入依賴

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>

2 創(chuàng)建配置類

@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

3 創(chuàng)建WebSocketServer服務(wù)類 用來(lái)接收數(shù)據(jù)

websocket的常用注解只有這5個(gè)

  • @ServerEndpoint注意上下文路徑,websocket連接地址

  • @OnMessage只有第一次加載websocket的時(shí)候,會(huì)調(diào)用,生命周期只有一次

  • @OnClose只有關(guān)閉websocket鏈接的時(shí)候,會(huì)調(diào)用,生命周期只有一次

  • @OnMessage每次接收信息的時(shí)候,都會(huì)調(diào)用,調(diào)用比較頻繁

  • @OnError發(fā)生錯(cuò)誤的時(shí)候調(diào)調(diào)用

/**
 * 類似RequestMapping的地址
 * ws://localhost:8080/ws/000001
 */
@ServerEndpoint("/ws/{uuid}")
@Component
public class WebSocketServer {

    private Session session; //客戶端會(huì)話
    
    //存放每個(gè)客戶端的連接會(huì)話
    public static ConcurrentHashMap<String,WebSocketServer> clients = new ConcurrentHashMap<>();
    
    //開啟連接
    //存入連接回話中
    @OnOpen
    public void onOpen(Session session, @PathParam( "uuid") String uuid){
        System.out.println("當(dāng)前的uuid為:"+uuid);
        this.session = session;
        clients.put(uuid,this);
    }

    //發(fā)送消息
    @OnMessage
    public void OnMessage(String msg, @PathParam( "uuid") String uuid){
        System.out.println("當(dāng)前的uuid為:"+uuid);
        System.out.println("收到消息: "+msg);
    }

    //關(guān)閉連接
    @OnClose
    public void onClose(@PathParam( "uuid") String uuid){
        System.out.println("當(dāng)前的uuid為:"+uuid);
        System.out.println("關(guān)閉socket連接"+uuid);
        clients.remove(uuid);
    }
    //發(fā)生異常的情況
    @OnError
    public void onError(Throwable error) {
        error.printStackTrace();
    }
    
}

4 啟動(dòng)項(xiàng)目

springboot實(shí)現(xiàn)websocket客戶端,Java,# 工具類,spring boot,websocket,java,Powered by 金山文檔

三、一般都是前端為客戶端,后端為服務(wù)端這種方式

前端客戶端,我不會(huì),需要的自己百度,哈哈哈

四、搭建java-websocket客戶端

該案例,只是告訴大家,可以用java搭建客戶端

4.1 依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.java-websocket</groupId>
            <artifactId>Java-WebSocket</artifactId>
            <version>1.3.5</version>
        </dependency>

4.2 客戶端代碼

@Component
public class WebSocketConfig {
 
    @Bean
    public WebSocketClient webSocketClient() {
        try {
                WebSocketClient webSocketClient = new WebSocketClient(new URI("ws://localhost:8081/ws/000001"),new Draft_6455()) {
                @Override
                public void onOpen(ServerHandshake handshakedata) {
                    System.out.println("ws 連接成功");
                }
 
                @Override
                public void onMessage(String message) {
                    System.out.println("ws 收到消息"+message);
 
                }
 
                @Override
                public void onClose(int code, String reason, boolean remote) {
                    System.out.println("ws 退出");
                }
 
                @Override
                public void onError(Exception ex) {
                    System.out.println("連接錯(cuò)誤"+ex.getMessage());
                }
            };
            webSocketClient.connect();
            return webSocketClient;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
 
}

4.3 發(fā)送消息的代碼

@SpringBootApplication
@RestController
public class SpringbootWebsocketClientApplication {


    @Autowired
    private WebSocketClient webSocketClient;

    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebsocketClientApplication.class, args);
    }


    @RequestMapping("/get")
    public String send(){
        webSocketClient.send("我是ws客戶端,你好?。?!");
        return "發(fā)送成功";
    }

}

4.4 結(jié)果

springboot實(shí)現(xiàn)websocket客戶端,Java,# 工具類,spring boot,websocket,java,Powered by 金山文檔

4.5 服務(wù)端收到消息

當(dāng)前的uuid為:000001
收到消息: 我是ws客戶端,你好!??!

五、websocket傳遞頭信息,協(xié)議頭token的前后端解決方案

  1. js websocket 傳遞token

websocket協(xié)議在握手階段借用了HTTP的協(xié)議,但是在JavaScript websocketAPI中并沒(méi)有修改請(qǐng)求頭的方法。

1.1 基于協(xié)議頭

websocket請(qǐng)求頭中可以包含Sec-WebSocket-Protocol這個(gè)屬性,該屬性是一個(gè)自定義的子協(xié)議。它從客戶端發(fā)送到服務(wù)器并返回從服務(wù)器到客戶端確認(rèn)子協(xié)議。我們可以利用這個(gè)屬性添加token。

var token='fasdfadfasdfa'

var  ws = new WebSocket("ws://" + url+ "/webSocketServer",[token]);
  1. 后臺(tái)取出websocket協(xié)議頭的參數(shù)

2.1 取出token

token = ((HttpServletRequest) servletRequest).getHeader("Sec-WebSocket-Protocol");

2.2 注意大坑

如果傳遞了token參數(shù),后端響應(yīng)的時(shí)候,也必須帶上這個(gè)token響應(yīng)!否則前端接收不到數(shù)據(jù)!

可以采用servlet的過(guò)濾器來(lái)做文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-739139.html

@Order(1)
@Component
@WebFilter(filterName = "WebsocketFilter", urlPatterns = "/home/*")
public class WebsocketFilter implements Filter {
 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        String token = ((HttpServletRequest) servletRequest).getHeader("Sec-WebSocket-Protocol");

        response.setHeader("Sec-WebSocket-Protocol",token);

        filterChain.doFilter(servletRequest, servletResponse);
    }
 
    @Override
    public void destroy() {
 
    }
}

六、結(jié)尾

websocket最偉大之處在于服務(wù)器和客戶端可以在給定的時(shí)間范圍內(nèi)的任意時(shí)刻,相互推送信息。 瀏覽器和服務(wù)器只需要要做一個(gè)握手的動(dòng)作,在建立連接之后,服務(wù)器可以主動(dòng)傳送數(shù)據(jù)給客戶端,客戶端也可以隨時(shí)向服務(wù)器發(fā)送數(shù)據(jù)。

第一、WebSocket是HTML5中的協(xié)議,支持持久連接;而Http協(xié)議不支持持久連接。

第二、首先,Websocket是一個(gè)持久化的協(xié)議,相對(duì)于HTTP這種非持久的協(xié)議來(lái)說(shuō)

HTTP的生命周期通過(guò) Request 來(lái)界定,也就是一個(gè) Request 一個(gè) Response ,那么在 HTTP1.0 中,這次HTTP請(qǐng)求就結(jié)束了。

在HTTP1.1中進(jìn)行了改進(jìn),使得有一個(gè)keep-alive,也就是說(shuō),在一個(gè)HTTP連接中,可以發(fā)送多個(gè)Request,接收多個(gè)Response。但是請(qǐng)記住 Request = Response , 在HTTP中永遠(yuǎn)是這樣,也就是說(shuō)一個(gè)request只能有一個(gè)response。而且這個(gè)response也是被動(dòng)的,不能主動(dòng)發(fā)起。

第三、傳統(tǒng)的http請(qǐng)求,其并發(fā)能力都是依賴同時(shí)發(fā)起多個(gè)TCP連接訪問(wèn)服務(wù)器實(shí)現(xiàn)的(因此并發(fā)數(shù)受限于瀏覽器允許的并發(fā)連接數(shù)),而websocket則允許我們?cè)谝粭lws連接上同時(shí)并發(fā)多個(gè)請(qǐng)求,即在A請(qǐng)求發(fā)出后A響應(yīng)還未到達(dá),就可以繼續(xù)發(fā)出B請(qǐng)求。由于TCP的慢啟動(dòng)特性(新連接速度上來(lái)是需要時(shí)間的),以及連接本身的握手損耗,都使得websocket協(xié)議的這一特性有很大的效率提升。

第四、http協(xié)議的頭部太大,且每個(gè)請(qǐng)求攜帶的幾百上千字節(jié)的頭部大部分是重復(fù)的,很多時(shí)候可能響應(yīng)都遠(yuǎn)沒(méi)有請(qǐng)求中的header空間大。如此多無(wú)效的內(nèi)容傳遞是因?yàn)闊o(wú)法利用上一條請(qǐng)求內(nèi)容,websocket則因?yàn)閺?fù)用長(zhǎng)連接而沒(méi)有這一問(wèn)題。

第五、當(dāng)需要實(shí)現(xiàn)客戶端刷新消息時(shí),傳統(tǒng)方案往往通過(guò)定時(shí)ajax請(qǐng)求實(shí)現(xiàn),實(shí)際上對(duì)多數(shù)用戶多數(shù)時(shí)間下這些請(qǐng)求都是無(wú)意義了,并且非常占用資源,websocket資源占用就小很多

到了這里,關(guān)于快速搭建springboot websocket客戶端的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpringBoot集成WebSocket實(shí)現(xiàn)客戶端與服務(wù)端長(zhǎng)連接通信

    SpringBoot集成WebSocket實(shí)現(xiàn)客戶端與服務(wù)端長(zhǎng)連接通信

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

    2024年02月02日
    瀏覽(28)
  • Java:SpringBoot整合WebSocket實(shí)現(xiàn)服務(wù)端向客戶端推送消息

    Java:SpringBoot整合WebSocket實(shí)現(xiàn)服務(wù)端向客戶端推送消息

    思路: 后端通過(guò)websocket向前端推送消息,前端統(tǒng)一使用http協(xié)議接口向后端發(fā)送數(shù)據(jù) 本文僅放一部分重要的代碼,完整代碼可參看github倉(cāng)庫(kù) websocket 前端測(cè)試 :http://www.easyswoole.com/wstool.html 依賴 項(xiàng)目目錄 完整依賴 配置 WebSocketServer.java 前端頁(yè)面 websocket.html 前端邏輯 index.js 參

    2024年02月04日
    瀏覽(29)
  • SpringBoot WebSocket做客戶端

    常見的都是springboot應(yīng)用做服務(wù),前端頁(yè)面做客戶端,進(jìn)行websocket通信進(jìn)行數(shù)據(jù)傳輸交互。但其實(shí)springboot服務(wù)也能做客戶端去連接別的webSocket服務(wù)提供者。 剛好最近在項(xiàng)目中就使用到了,需求背景大概就是我們作為一個(gè)java段應(yīng)用需要和一個(gè)C語(yǔ)言應(yīng)用進(jìn)行通信。在項(xiàng)目需求及

    2024年02月11日
    瀏覽(24)
  • SpringBoot2.0集成WebSocket,多客戶端

    適用于單客戶端,一個(gè)賬號(hào)登陸一個(gè)客戶端,登陸多個(gè)客戶端會(huì)報(bào)錯(cuò) The remote endpoint was in state [TEXT_FULL_WRITING]? 這是因?yàn)榇藭r(shí)的session是不同的,只能鎖住一個(gè)session,解決此問(wèn)題的方法把全局靜態(tài)對(duì)象鎖住,因?yàn)橘~號(hào)是唯一的

    2024年02月10日
    瀏覽(23)
  • SpringBoot+CAS整合服務(wù)端和客戶端實(shí)現(xiàn)SSO單點(diǎn)登錄與登出快速入門上手

    SpringBoot+CAS整合服務(wù)端和客戶端實(shí)現(xiàn)SSO單點(diǎn)登錄與登出快速入門上手

    教學(xué)講解視頻地址:視頻地址 因?yàn)镃AS支持HTTP請(qǐng)求訪問(wèn),而我們是快速入門上手視頻,所以這期教程就不教大家如何配置HTTPS了,如果需要使用HTTPS,可以參考其他博客去云服務(wù)器申請(qǐng)證書或者使用JDK自行生成一個(gè)證書。 下載CAS Server(直接下載壓縮包就可以) 這里我們用的是

    2024年02月02日
    瀏覽(18)
  • Springboot 集成WebSocket作為客戶端,含重連接功能,開箱即用

    使用演示 只需要init后調(diào)用sendMessage方法即可,做到開箱即用。內(nèi)部封裝了失敗重連接、斷線重連接等功能。 基于Springboot工程 引入websocket依賴 開箱即用的工具類

    2024年02月04日
    瀏覽(36)
  • Java實(shí)現(xiàn)websocket客戶端

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

    2024年02月16日
    瀏覽(86)
  • websocket客戶端實(shí)現(xiàn)(java)

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

    2024年02月15日
    瀏覽(26)
  • JAVA使用WebSocket實(shí)現(xiàn)多客戶端請(qǐng)求

    工作前提:兩個(gè)服務(wù)之間實(shí)現(xiàn)聊天通訊,因?yàn)榻橛趦蓚€(gè)服務(wù),兩個(gè)客戶端 方案1:多個(gè)服務(wù)端,多個(gè)客戶端,使用redis把用戶數(shù)據(jù)ip進(jìn)行存儲(chǔ),交互拿到redis數(shù)據(jù)進(jìn)行推送 方案2: 一個(gè)服務(wù)端,多個(gè)客戶端,拿到客戶端的id和需要推送的id進(jìn)行拼接存儲(chǔ) 此文章使用的是方案2 1. 引

    2024年02月11日
    瀏覽(17)
  • 實(shí)現(xiàn)c++輕量級(jí)別websocket協(xié)議客戶端

    實(shí)現(xiàn)c++輕量級(jí)別websocket協(xié)議客戶端

    因以前發(fā)過(guò)這個(gè)代碼,但是一直沒(méi)有整理,這次整理了一下,持續(xù)修改,主要是要使用在arm的linux上,發(fā)送接收的數(shù)據(jù)壓縮成圖片發(fā)送出去。 要達(dá)到輕量websocket 使用,必須要達(dá)到幾個(gè)方面才能足夠簡(jiǎn)單, 1、不用加入其他的庫(kù) 2、只需要使用頭文件包含就可以 3、跨平臺(tái) 如果

    2024年02月12日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包