亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

WebSocket 的 6 種集成方式

admin
2025年6月28日 22:57 本文熱度 125

WebSocket 這玩意兒吧,說簡(jiǎn)單也簡(jiǎn)單,說復(fù)雜也能復(fù)雜死你。剛?cè)胄心菚?huì)兒我一直以為它就是個(gè)“瀏覽器能持久連服務(wù)端的通信協(xié)議”,后來項(xiàng)目做多了,才發(fā)現(xiàn)——哦,原來背后是個(gè)坑連坑的連環(huán)大陷阱 ??

這次我來聊聊我踩過的 WebSocket 六種集成方式,說實(shí)話,大部分人可能一輩子都用不到那么多,但你遇上個(gè)奇葩需求,或者非要搞集群通信,那這些方式你就得一個(gè)個(gè)過。

先說點(diǎn)干貨(各位產(chǎn)品經(jīng)理看過來):我推薦的排序順序其實(shí)就和 Spring Boot 的兼容性成正比——Javax、WebMVC、WebFlux 三個(gè)能和 Spring 玩得轉(zhuǎn)的,我給它們畫個(gè)重點(diǎn) ?。剩下 Java-WebSocket、SocketIO 和 Netty,我給它們分組叫“搞事情專用”,你如果喜歡造輪子、搞底層優(yōu)化、或者需求野得一批,歡迎深入。

Javax WebSocket,JSR-356 標(biāo)準(zhǔn)實(shí)現(xiàn),這個(gè)方案你一眼就能認(rèn)出來——@ServerEndpoint、@OnOpen@OnMessage、@OnClose,全家福注解到齊。而且這是少有的“標(biāo)準(zhǔn)庫(kù)”,可以不用 Spring,也能跑(當(dāng)然你真要脫離 Spring,很多時(shí)候不是跑不跑得動(dòng)的問題,是你心理扛不扛得?。?..

項(xiàng)目里我用過一段時(shí)間 javax 實(shí)現(xiàn),服務(wù)端配 ServerEndpointExporter,前端只要能連上 ws:// 就能開始收發(fā)。唯一讓我不爽的是這個(gè)注解方式實(shí)在太硬核了,配合 Spring 注入有點(diǎn)別扭,每次想注個(gè) Service 還得用 SpringContextHolder.getBean(...) 這種老土方式,優(yōu)雅度直接下降 3 個(gè)檔次。

還有一點(diǎn)細(xì)節(jié),JSR 的 ping/pong 是瀏覽器自動(dòng)處理的,這一點(diǎn)不錯(cuò)。但是你要搞心跳檢查?要么前端定時(shí)發(fā)心跳消息,要么服務(wù)端寫個(gè)定時(shí)掃描活躍連接,反正就是不太優(yōu)雅。

下面說說 WebMVC 的 WebSocket 集成,也就是 Spring 官方給你的一整套——WebSocketHandler、WebSocketConfigurer、HandshakeInterceptor,一套搞定。

我最喜歡它的一點(diǎn)是“可以寫配置類”,就是那種你用 Spring Boot 寫慣了的那種配置方式,沒有一堆注解散落一地,整潔。比如服務(wù)端寫個(gè) handler:

public class MyWebSocketHandler implements WebSocketHandler {
    public void handleTextMessage(WebSocketSession session, TextMessage message) {
        // 邏輯都在這里處理
    }
}

然后注冊(cè)就一句話:

registry.addHandler(new MyWebSocketHandler(), "/ws").addInterceptors(new MyInterceptor());

更騷的玩法還有自定義路徑匹配邏輯,那個(gè) UrlPathHelper.setRemoveSemicolonContent(false) 曾經(jīng)救過我一次,動(dòng)態(tài)路徑支持的效果拉滿 ??。

客戶端這塊用 StandardWebSocketClient 配 WebSocketConnectionManager,標(biāo)準(zhǔn)但略顯繁瑣。不過說實(shí)話,一旦你配置起來,后面接入多個(gè)服務(wù)都不是問題,特別適合那些需要服務(wù)內(nèi)服務(wù)通信、后臺(tái)通知這些場(chǎng)景。

至于 WebFlux 的響應(yīng)式 WebSocket,坦白講,這個(gè)我第一次接觸時(shí)一臉懵逼:為啥連個(gè)消息都要用 Flux?后來項(xiàng)目用了 Netty,我才慢慢愛上這個(gè)范兒。

服務(wù)端接口:

public class MyReactiveHandler implements WebSocketHandler {
    public Mono<Void> handle(WebSocketSession session) {
        return session.send(
            session.receive()
                   .doOnNext(msg -> System.out.println("收到:" + msg.getPayloadAsText()))
                   .map(msg -> session.textMessage("收到啦:" + msg.getPayloadAsText()))
        );
    }
}

這句代碼看著簡(jiǎn)潔,但你真想寫個(gè)帶狀態(tài)管理的邏輯,就知道痛苦了。FluxSink 寫起來很繞,特別是想加個(gè)延時(shí)發(fā)送、限流、統(tǒng)計(jì)這些邏輯,基本全靠自己畫地為牢,框架幫不了你多少。

客戶端用 ReactorNettyWebSocketClient,連接方式是異步的、鏈?zhǔn)斤L(fēng)格的。優(yōu)點(diǎn)是性能高、負(fù)載輕,缺點(diǎn)是...調(diào)試起來血壓飆升 ??。

講真,如果你用的是 WebFlux 做后端,那 WebSocket 就別用 MVC 的那一套了,不然你兩個(gè)世界的東西混一起,絕對(duì)翻車。我們組就有個(gè)小哥在 Gateway 那邊用了 WebFlux,結(jié)果試圖接入 MVC 的 WebSocket,調(diào)了兩天都沒通...最終選擇重寫 ??。

說完這三種 Spring 系的主力方案,再來看看外圍勢(shì)力:

Java-WebSocket 這個(gè)庫(kù),我打心底喜歡它的輕量。不依賴 Servlet,不依賴 Spring,直接 WebSocketServer new 一個(gè)就能跑:

public class MyServer extends WebSocketServer {
    public void onMessage(WebSocket conn, String message) {
        conn.send("收到你發(fā)的:" + message);
    }
}

適合寫那種臨時(shí)工具、調(diào)試服務(wù)、或者一些命令式的業(yè)務(wù)模塊,比如我搞過一個(gè)調(diào)試 Redis 的在線工具,用 Java-WebSocket + Swing 寫的,10分鐘起飛。

Socket.IO 就是另一個(gè)方向的東西了,它不僅搞 WebSocket,還加了自己的協(xié)議封裝。斷線重連、命名空間、廣播機(jī)制,都是自帶的。你想都不用想,這就是搞 IM、聊天室、多人協(xié)作平臺(tái)的好幫手。

但說實(shí)話,Java 這邊的 Socket.IO 實(shí)現(xiàn)遠(yuǎn)遠(yuǎn)沒 Node.js 那邊香,我當(dāng)時(shí)接手一個(gè)項(xiàng)目就是前端 Node 后端 Java,用 socket.io-client 直連 Java 服務(wù),光是 handshake 就卡了我一天...得調(diào)版本、搞兼容,最后還是靠抓包和 Fiddler 才找出問題。

Netty 最后說,說白了就是“老子不靠你們?nèi)魏慰蚣?,我自己就是框架”。你想怎么搞就怎么搞,協(xié)議你自己設(shè)計(jì)、握手你自己搞,連消息格式都隨便你定義。這玩意我只在高并發(fā)場(chǎng)景下用過,比如我們那個(gè)實(shí)時(shí)日志推送系統(tǒng),就得用 Netty + protobuf,壓縮率+吞吐量雙贏。

不過 Netty 不建議你手滑就上,一定要評(píng)估你是不是能駕馭得住這個(gè)家伙。就像開跑車一樣,帥是帥,撞一次代價(jià)可大 ?????。

最后總結(jié)點(diǎn)我自己項(xiàng)目里的感受:

  • 想快速搭項(xiàng)目、跟前端打通,Spring WebMVC 是首選,穩(wěn);
  • 如果你項(xiàng)目已經(jīng)是全 reactive 架構(gòu),那就 WebFlux,一體化舒服;
  • 想寫跨平臺(tái)、跨語言的調(diào)試工具,可以用 Java-WebSocket;
  • 聊天室、多人互動(dòng)類業(yè)務(wù),Socket.IO 大殺器;
  • 想極限性能、底層定制、或者挑戰(zhàn)人生...Netty,歡迎上車!

客戶端這塊,不管哪種方式,最容易出問題的其實(shí)就是“文檔太少 + 異常提示爛”,特別是連接失敗那種,一堆 UNKNOWN_REASON,調(diào)起來跟盲盒一樣...

要我說,WebSocket 這個(gè)東西,表面看是個(gè)簡(jiǎn)單協(xié)議,背后隱藏著無數(shù)“到底誰主動(dòng)斷了連接”“為什么發(fā)不出去”“為啥掉線了還沒重連”的靈異事件。


閱讀原文:原文鏈接


該文章在 2025/7/1 23:35:50 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved