<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
專案中經常會用到訊息推播功能,關於推播技術的實現,我們通常會聯想到輪詢、comet長連線技術,雖然這些技術能夠實現,但是需要反覆連線,對於服務資源消耗過大,隨著技術的發展,HtML5定義了WebSocket協定,能更好的節省伺服器資源和頻寬,並且能夠更實時地進行通訊。本文將介紹如何採用websocket實現訊息推播。
WebSocket協定是基於TCP的一種新的網路協定。它實現了瀏覽器與伺服器全雙工(full-duplex)通訊——允許伺服器主動傳送資訊給使用者端。瀏覽器和伺服器僅需一次握手,兩者之間就直接可以建立永續性的連線,並進行雙向資料傳輸。
Websocket協定基於Http協定,針對Http協定進行了相關的改善,且Websocket協定也需要建立TCP連線來實現資料傳輸,具體實現如下圖:
說明:
相同點:都是一樣基於TCP的,都是可靠性傳輸協定。都是應用層協定。
不同點:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.4.RELEASE</version> <relativePath/> </parent> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
@Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
@ServerEndpoint(value="/websocket/{uid}") @Component public class WebSocketServer { private Logger logger = LoggerFactory.getLogger(WebSocketServer.class); private static final AtomicInteger onlineCount = new AtomicInteger(0); private static CopyOnWriteArraySet<Session> sessionSet = new CopyOnWriteArraySet<Session>(); @OnOpen public void onOpen(Session session,@PathParam("uid") String uid) { logger.info("open message uid:{}",uid); sessionSet.add(session); onlineCount.incrementAndGet(); logger.info("視窗開始監聽uid:{},當前線上人數:{}",uid,onlineCount); } @OnClose public void onClose(Session session) { String sessionId=session.getId(); logger.info("sessionid:{} close",sessionId); sessionSet.remove(this); int count=onlineCount.decrementAndGet(); logger.info("有一連線關閉!當前線上人數為:{}",count); } @OnError public void onError(Session session, Throwable error) { logger.error("訊息發生錯誤:{},Session ID: {}",error.getMessage(),session.getId()); } public void batchSendMesasge(String uid,String message) throws IOException { logger.info("推播訊息到視窗:{},推播內容:{}",uid,message); for(Session session:sessionSet){ sendMessage(session, message); } } public void sendMessage(Session session, String message) throws IOException { if(session!=null) { synchronized (session) { session.getBasicRemote().sendText(message); } } } }
說明: @OnOpen :當有新的WebSocket連線進入時呼叫 @OnClose:當有WebSocket連線關閉時呼叫 @OnError :當有WebSocket丟擲異常時呼叫 @OnMessage:當接收到字串訊息時,對該方法進行回撥
@Controller public class WebScoketController { @Autowired private WebSocketServer webSocketServer; @ResponseBody @RequestMapping("/sendMessage") public String batchMessage(String uid,String message) { Map<String, String> map =new HashMap<String, String>(); try { map.put("code", "200"); webSocketServer.batchSendMesasge(uid,message); } catch (Exception e) { map.put("code", "-1"); map.put("message", e.getMessage()); } return JSON.toJSONString(map); } @GetMapping("/enter") public String enter() { return "webscoketTest.html"; } }
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>websocket test</title> <script type="text/javascript"> if ("WebSocket" in window) { console.log("您的瀏覽器支援 WebSocket!"); var ws = new WebSocket("ws://127.0.0.1:9092/websocket/1234"); console.log('ws連線狀態:' + ws.readyState); //開啟 ws.onopen = function() { ws.send("message test"); console.log("mesage sending"); }; //傳送訊息 ws.onmessage = function (evt) { var received_msg = evt.data; alert(received_msg); }; //關閉 ws.onclose = function() { // 關閉 websocket console.log("socket is close"); }; } else { console.log("您的瀏覽器不支援 WebSocket!"); } </script> </head> </html>
啟動程式:執行http://localhost:9092/enter 進入頁面開啟websocket。
使用者傳送訊息:http://localhost:9092/sendMessage?uid=1235&message=this%20is%20message1
執行的結果如下:
open message uid:1234
[nio-9092-exec-2] c.s.f.w.controller.WebSocketServer: 視窗開始監聽uid:1234,當前線上人數:1
[nio-9092-exec-5] c.s.f.w.controller.WebSocketServer: 推播訊息到視窗:1234,推播內容:this is message
以上就是SpringBoot+WebSocket實現訊息推播功能的詳細內容,更多關於SpringBoot WebSocket訊息推播的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45