电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

SpringBoot集成WebSocket長連接實際應用詳解

瀏覽:62日期:2023-05-12 15:52:11

前言:

一、WebSocket之初出茅驢

官方定義:WebSocket是一種在單個TCP連接上進行全雙工通信的協議。WebSocket使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在WebSocket API中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,并進行雙向數據傳輸。是真正的雙向平等對話,屬于服務器推送技術的一種。

太官方啦,還是博主過來翻譯一下吧 :WebSocket技術只需要service和client建立一次連接,就能實現服務器和客戶端雙方相互頻繁的發送請求和通信!(簡單加粗暴的翻譯有木有,哈哈!)

WebSocket經典的使用場景:網站在線聊天系統、彈幕系統…

臣附議:webSocket技術無法做到向下兼容,不兼容低版本的IE,因此依賴于瀏覽器版本,這也正是webSocket非常顯著的缺陷。

二、WebSocket的出現到底為我們解決了什么實際問題?

在傳統的b/s架構中,要實現服務器向client進行實時消息推送功能,市場上常用的解決方案大致分為三類:

定時輪詢 客戶端以一定的時間間隔向服務端發出請求 長輪詢 如果服務器沒有可以立即返回給客戶端的數據,則不會立刻返回一個空結果 流技術 客戶端隱藏的窗口向服務端發出一個長輪詢的請求

長輪詢機制:

SpringBoot集成WebSocket長連接實際應用詳解

綜合這幾種方案,您會發現這些目前我們所使用的所謂的實時技術并不是真正的實時技術,它們只是在用 Ajax 方式來模擬實時的效果,定時輪詢需要實時獲取取服務端信息的應用時, client需要頻繁輪詢server,為了拿到最新信息, client一直這樣循環下去server如果一直沒有新的消息, client的大多請求都是屬于無效請求, 導致會帶來很多無謂的網絡傳輸,所以這是一種非常低效的實時方案。長輪詢對服務器造成的壓力非常大,并且如果服務端的數據變更非常頻繁的話,這種方式無異于定時輪詢。所以為了解決傳統http請求的實際問題,WebSocket技術應運而生!下面博主給張圖讓大家生動的理解傳統HTTP和WebSocket的差異化:

SpringBoot集成WebSocket長連接實際應用詳解

三、博主使用WebSocket的場景

博主最進在公司調用第三方影像采集系統,由于影像狀態是異步返回給業務系統的,導致當業務系統收到第三方回調后,對于前臺用戶體驗來說是無感知的,因此前臺必須刷新頁面才能獲取到影像最新狀態。這時候由service主動向client實時發送影像采集狀態的通知是最好不過的方案!在上述提到的常用解決方案,像輪詢這種比較low的實現,博主作為技術宅,肯定是不會作為技術選型的,哈哈…

四、不多bb,上代碼!

本項目是基于SpringBoot環境開發

1、導入websocket坐標

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

2、封裝WebSocketUtil工具類,用于提供對session鏈接、斷開連接、推送消息的簡單控制。

public class WebsocketUtil { /** * 記錄當前在線的Session */ private static final Map<String, Session> ONLINE_SESSION = new ConcurrentHashMap<> (); /** * 添加session * @param userId * @param session */ public static void addSession(String userId, Session session){ // 此處只允許一個用戶的session鏈接。一個用戶的多個連接,我們視為無效。 ONLINE_SESSION.putIfAbsent ( userId, session ); } /** * 關閉session * @param userId */ public static void removeSession(String userId){ ONLINE_SESSION.remove ( userId ); } /** * 給單個用戶推送消息 * @param session * @param message */ public static void sendMessage(Session session, String message){ if(session == null){ return; } // 同步 RemoteEndpoint.Async async = session.getAsyncRemote (); async.sendText ( message ); } /** * 向所有在線人發送消息 * @param message */ public static void sendMessageForAll(String message) { //jdk8 新方法 ONLINE_SESSION.forEach((sessionId, session) -> sendMessage(session, message)); }}

3、 WebSocketController

如上,已經創建好了簡單的session管理和消息管理,接下來要使用注解的方式,使用SpringBoot的websocket包提供的方法,實現OnOpen、OnClose、OnMessage三個方法,再實現一個OnError方法來應對異常。代碼段如下:

/** * websocket接口處理類 */@Component@ServerEndpoint ( value = '/chat/{userid}' )public class WebsocketController { /** * 連接事件,加入注解 * @param userId * @param session */ @OnOpen public void onOpen( @PathParam ( value = 'userid' ) String userId, Session session ) { String message ='[' + userId + ']加入聊天室!!'; // 添加到session的映射關系中 WebsocketUtil.addSession ( userId, session ); // 廣播通知,某用戶上線了 WebsocketUtil.sendMessageForAll ( message ); } /** * 連接事件,加入注解 * 用戶斷開鏈接 * @param userId * @param session */ @OnClose public void onClose(@PathParam ( value = 'userId' ) String userId, Session session ) { String message ='[' + userId + ']退出了聊天室...'; // 刪除映射關系 WebsocketUtil.removeSession ( userId ); // 廣播通知,用戶下線了 WebsocketUtil.sendMessageForAll ( message ); } /** * 當接收到用戶上傳的消息 * @param userId * @param session */ @OnMessage public void onMessage(@PathParam ( value = 'userId' ) String userId, Session session ,String message) { String msg ='[' + userId + ']:'+message; // 直接廣播 WebsocketUtil.sendMessageForAll ( msg ); } /** * 處理用戶活連接異常 * @param session * @param throwable */ @OnError public void onError(Session session, Throwable throwable) { try { session.close(); } catch (IOException e) { e.printStackTrace(); } throwable.printStackTrace(); }}

4、添加 ServerEndpointExporter 啟動Bean

public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } /** * 會自動注冊使用了@ServerEndpoint注解聲明的Websocket endpoint * 要注意,如果使用獨立的servlet容器, * 而不是直接使用springboot的內置容器, * 就不要注入ServerEndpointExporter,因為它將由容器自己提供和管理。 */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); }}

那些年踩過的坑:注意:在websocketEndpoint中,使用@Autowired一些列注解注入Bean時候,一直無法注入,報空指針。原因在于spring管理的都是單例(singleton),和 websocket (多對象)相沖突。解決辦法:通過上下文獲取bean實例:從Spring上下文獲取bean實例的方法

到此這篇關于SpringBoot集成WebSocket長連接實際應用詳解的文章就介紹到這了,更多相關SpringBoot WebSocket長連接內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 石家庄律师_石家庄刑事辩护律师_石家庄取保候审-河北万垚律师事务所 | 塑料瓶罐_食品塑料瓶_保健品塑料瓶_调味品塑料瓶–东莞市富慷塑料制品有限公司 | 交流伺服电机|直流伺服|伺服驱动器|伺服电机-深圳市华科星电气有限公司 | (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 海德莱电力(HYDELEY)-无功补偿元器件生产厂家-二十年专业从事电力电容器 | 江苏农村商业银行招聘网_2024江苏农商行考试指南_江苏农商行校园招聘 | 东莞市海宝机械有限公司-不锈钢分选机-硅胶橡胶-生活垃圾-涡电流-静电-金属-矿石分选机 | 高扬程排污泵_隔膜泵_磁力泵_节能自吸离心水泵厂家-【上海博洋】 | 【孔氏陶粒】建筑回填陶粒-南京/合肥/武汉/郑州/重庆/成都/杭州陶粒厂家 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | 桨叶搅拌机_螺旋挤压/方盒旋切造粒机厂家-无锡市鸿诚输送机械有限公司 | QQ房产导航-免费收录优秀房地产网站_房地产信息网 | 头条搜索极速版下载安装免费新版,头条搜索极速版邀请码怎么填写? - 欧远全 | 无尘烘箱_洁净烤箱_真空无氧烤箱_半导体烤箱_电子防潮柜-深圳市怡和兴机电 | 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 郑州巴特熔体泵有限公司专业的熔体泵,熔体齿轮泵与换网器生产厂家 | HYDAC过滤器,HYDAC滤芯,现货ATOS油泵,ATOS比例阀-东莞市广联自动化科技有限公司 | 安驭邦官网-双向万能直角铣头,加工中心侧铣头,角度头[厂家直销] 闸阀_截止阀_止回阀「生产厂家」-上海卡比阀门有限公司 | 明渠式紫外线杀菌器-紫外线消毒器厂家-定州市优威环保 | 暴风影音 | 游动电流仪-流通式浊度分析仪-杰普仪器(上海)有限公司 | 高精度-恒温冷水机-螺杆式冰水机-蒸发冷冷水机-北京蓝海神骏科技有限公司 | 集菌仪_智能集菌仪_全封闭集菌仪_无菌检查集菌仪厂家-那艾 | 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 科箭WMS仓库管理软件-TMS物流管理系统-科箭SaaS云服务 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 琉璃瓦-琉璃瓦厂家-安徽盛阳新型建材科技有限公司 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 污水/卧式/潜水/钻井/矿用/大型/小型/泥浆泵,价格,参数,型号,厂家 - 安平县鼎千泵业制造厂 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 泵阀展|阀门展|水泵展|流体机械展 -2025上海国际泵管阀展览会flowtech china | 数控走心机-双主轴走心机厂家-南京建克| 电力测功机,电涡流测功机,磁粉制动器,南通远辰曳引机测试台 | 宝元数控系统|对刀仪厂家|东莞机器人控制系统|东莞安川伺服-【鑫天驰智能科技】 | 光栅尺厂家_数显表维修-苏州泽升精密机械 | 振动筛,震动筛,圆形振动筛,振动筛价格,振动筛厂家-新乡巨宝机电 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 上海APP开发-APP制作-APP定制开发-上海APP开发制作公司-咏熠科技 | b2b网站大全,b2b网站排名,找b2b网站就上地球网 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 |