Spring Boot中的WebSocket-世界热推荐
很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
【资料图】
在这种情况下,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
简介WebSocket是一种在单个TCP连接上进行全双工通信的协议。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
特点•较少的控制开销。相对于HTTP请求每次都要携带完整的头部,开销显著减少了。
•更强的实时性。由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。
•保持连接状态。Websocket需要先创建连接,是一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。
•更好的二进制支持。Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。
•可以支持扩展。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。
•更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。
在SpringBoot项目中创建WebSocket Server项目依赖(Maven)WebSocket服务4.0.0 cn.jeremysong demo 1.0 org.springframework.boot spring-boot-starter-parent 3.0.3 org.springframework.boot spring-boot-starter-websocket 3.0.3
importorg.springframework.context.annotation.Bean;importorg.springframework.stereotype.Component;importorg.springframework.web.socket.server.standard.ServerEndpointExporter;/***ServerEndpointExporter作用**这个Bean会自动注册使用@ServerEndpoint注解声明的websocketendpoint**/@ComponentpublicclassWebSocketConfig{@BeanpublicServerEndPointExporterserverEndPointExporter(){returnnewServerEndPointExporter();}}
importlombok.extern.slf4j.Slf4j;importorg.springframework.stereotype.Component;importjavax.websocket.OnClose;importjavax.websocket.OnMessage;importjavax.websocket.OnOpen;importjavax.websocket.Session;importjavax.websocket.server.PathParam;importjavax.websocket.server.ServerEndpoint;importjava.io.IOException;importjava.util.concurrent.ConcurrentHashMap;@Slf4j@Component@ServerEndpoint("/websocket/{name}")publicclassWebSocket{privateSessionsession;privateStringname;privatestaticConcurrentHashMap使用JavaScript创建WebSocket ClientWebSocket客户端webSocketSet=newConcurrentHashMap<>();@OnOpenpublicvoidonOpen(Sessionsession,@PathParam(value="name")Stringname){this.session=session;this.name=name;webSocketSet.put(name,this);}@OnClosepublicvoidonClose(){webSocketSet.remove(this.name);}@OnMessagepublicvoidonMessage(Stringmessage){log.info("{}send{}",this.name,message);}/***群发*@parammessage消息内容*/publicvoidgroupSending(Stringmessage){for(Stringname:webSocketSet.keySet()){try{webSocketSet.get(name).session.getBasicRemote().sendText(message);}catch(IOExceptione){e.printStackTrace();}}}/***指定发动消息*@paramname指定的客户端名*@parammessage消息内容*/publicvoidappointSending(Stringname,Stringmessage){try{webSocketSet.get(name).session.getBasicRemote().sendText(message);}catch(IOExceptione){e.printStackTrace();}}}
letwebsocket=null;if("WebSocket"inwindow){websocket=newWebSocket("ws://localhost:8888/websocket/cli-1");websocket.onopen=function(){console.log("连接成功");};websocket.onclose=function(){console.log("退出连接");};websocket.onmessage=function(event){console.log("收到消息:"+event.data);};websocket.onerror=function(){console.log("连接出错");};//MDNExamplewebsocket.addEventListener("open",function(event){websocket.send("HelloServer!");});websocket.addEventListener("message",function(event){console.log("Messagefromserver",event.data);});websocket.addEventListener("error",function(event){console.log("WebScoketerror:",event);});}window.onbeforeunload=function(){//页面关闭时关闭WebSocket连接websocket.close(1000);};在Chrome console中测试
执行如下命令时可以在Server端添加日志输出和debug观察交互现象。
>ws1=newWebSocket("ws://localhost:8888/websocket/name1");>ws1.send("Sendmessagetoserver!Iamname1");>ws2=newWebSocket("ws://localhost:8888/websocket/name2");>ws2.send("Sendmessagetoserver!Iamname2");>ws1.close(1000);>ws2.close(1000);参考
•WebSocket - MDN:
https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket•CloseEvent - MDN:
https://developer.mozilla.org/zh-CN/docs/Web/API/CloseEvent#status_codes欢迎关注我的公众号“须弥零一”,原创技术文章第一时间推送。
关键词:
精心推荐
- 优化生育(三孩)板块12月20日跌1.94%,美吉姆领跌,主力资金净流出8.12亿元_环球动态
- 科达利: 关于董事、高级管理人员减持计划数量过半的进展公告-世界关注
- 广元剑阁县:全力以赴推进基础项目建设
- 天天新动态:侨银股份: 关于变更部分募集资金投资项目实施地点及延长实施期限的公告
- 外媒:印度10月工业产值同比收缩4%
- 【天天快播报】弥蒙高铁通车:“三线交汇”折射中国西南巨变
- Dance in the moment|环球快消息
- 乔治36+8+6快船擒奇才 小卡13+8+6库兹马35+12 世界热议
- 工人偷200双鞋能判多少年
- 全羊汤做法 全羊汤的制作方法_当前快看
- 粤电力A: 广东电力发展股份有限公司第十届董事会2022年第五次通讯会议决议公告|每日速读
- 观天下!万润科技:我们认为,长江存储将在湖北存储之都打造、存储国产替代的过程中扮演非常重要的角色
- 世界快讯:中国冶金新材料(耐蚀钢)产业链对接会福州举行
- 国家统计局:投资有望保持持续增长 环球报道
-
12月15日盘中消息,9点36分ST升达(002259)触及涨停板。目前价格3 23,上涨4 87%。其所属行业燃气目前下跌。领涨股为ST升达。该股为天然气概念热股。
-
证券代码:002092 证券简称:中泰化学 公告编号:2022-139 新疆中泰化学
-
1、有固定收入的,抚养费一般可按其月总收入的百分之二十至三十的比例给付。负担两个以上子女抚养费的,比例可适当提高,但一般不得超过月总收
-
生命受到威胁要立刻报警,行为人依法受到治安处罚,如果情节恶劣的,构成刑事犯罪,依法判处刑事处罚。相关法律依据如下:一、有下列寻衅滋事
-
沪深交易所2022年12月13日公布的交易公开信息显示,佳沃食品(300268)因日涨幅达到15%的前5只证券登上龙虎榜。2、子公司从事冷冻海洋海产品进
X 关闭
X 关闭
产业
-
不用跑北京 在家门口也能挂上顶...
日前,我省首个神经疾病会诊中心——首都医科大学宣武医院河北医院...
-
“十四五”期间 河北省将优化快...
从省邮政管理局获悉,十四五期间,我省将优化快递空间布局,着力构...
-
张家口市宣化区:光伏发电站赋能...
3月19日拍摄的张家口市宣化区春光乡曹庄子村光伏发电站。张家口市宣...
-
“张同学”商标被多方抢注 涉及...
“张同学”商标被多方抢注,官方曾点名批评恶意抢注“丁真” ...
-
山东济南“防诈奶奶团”花式反诈...
中新网济南12月15日电 (李明芮)“老有所为 无私奉献 志愿服...
-
广州新增1例境外输入关联无症状...
广州卫健委今日通报,2021年12月15日,在对入境转运专班工作人...
-
西安报告初筛阳性病例转为确诊病例
12月15日10:20,经陕西西安市级专家组会诊,西安市报告新冠病毒...
-
广东东莞新增本土确诊病例2例 ...
(抗击新冠肺炎)广东东莞新增本土确诊病例2例 全市全员核酸检测...
-
中缅边境临沧:民警深夜出击捣毁...
中新网临沧12月15日电 (胡波 邱珺珲)记者15日从云南临沧边境...
-
“土家鼓王”彭承金:致力传承土...
中新网恩施12月15日电 题:“土家鼓王”彭承金:致力传承土家...