Java?springBoot初步使用websocket的代碼示例
一、什么是websocket
WebSocket是一種在Web應(yīng)用程序中實(shí)現(xiàn)實(shí)時(shí)雙向通信的協(xié)議。它為瀏覽器和服務(wù)器之間提供了一種持久連接,在一個(gè)連接上可以雙向傳輸數(shù)據(jù)。相比傳統(tǒng)的HTTP協(xié)議,WebSocket具有更低的延遲和更高的效率。
WebSocket使用了類似于握手的方式來建立連接。在握手過程中,瀏覽器和服務(wù)器會(huì)交換一些信息,以建立一個(gè)WebSocket連接。一旦連接建立,瀏覽器和服務(wù)器之間就可以實(shí)時(shí)地傳輸數(shù)據(jù),而不需要每次都發(fā)起新的HTTP請(qǐng)求。
WebSocket協(xié)議可以在不同的平臺(tái)和編程語言中實(shí)現(xiàn),包括Web瀏覽器和服務(wù)器端。在Web瀏覽器中,可以使用JavaScript中的WebSocket API來實(shí)現(xiàn)WebSocket連接。在服務(wù)器端,可以使用各種編程語言和框架來實(shí)現(xiàn)WebSocket服務(wù)器。
WebSocket的應(yīng)用場(chǎng)景非常廣泛。它可以用于實(shí)時(shí)聊天應(yīng)用、實(shí)時(shí)游戲、實(shí)時(shí)股票行情、實(shí)時(shí)協(xié)作編輯等需要實(shí)時(shí)通信的應(yīng)用程序。通過WebSocket,開發(fā)人員可以更加方便地實(shí)現(xiàn)實(shí)時(shí)通信功能,提高用戶體驗(yàn)。
這里我們使用Java配合springboot2進(jìn)行使用。
二、依賴坐標(biāo)地址
1.springBoot父級(jí)依賴
<!--依賴的父級(jí)工程--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.6</version> <relativePath/> </parent>
2.springBoot依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
3.webSocket依賴
<dependency> <groupId>org.java-websocket</groupId> <artifactId>Java-WebSocket</artifactId> <version>1.3.8</version> </dependency>
三、代碼
不多說了,直接拿去看吧,都在注釋里面了。
服務(wù)器:
package com.blockchain.qgy.network.websocket; import com.blockchain.qgy.util.Strings; import org.java_websocket.WebSocket; import org.java_websocket.handshake.ClientHandshake; import org.java_websocket.server.WebSocketServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.List; @Component public class P2pPointServer { //日志記錄 private Logger logger = LoggerFactory.getLogger(P2pPointServer.class); //本機(jī)的Server的WebSocket端口 private Integer port = 7001; //所有連接到服務(wù)器的WebSocket緩存器 private List<WebSocket> localSockets = new ArrayList<>(); public List<WebSocket> getLocalSockets() { return localSockets; } public void setLocalSockets(List<WebSocket> localSockets) { this.localSockets = localSockets; } @PostConstruct @Order(1) public void initServer(){ final WebSocketServer socketServer = new WebSocketServer(new InetSocketAddress(port)) { //創(chuàng)建鏈接成功時(shí)觸發(fā) @Override public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) { sendMessage(webSocket,"孩子們,我回來了!"); localSockets.add(webSocket); } //斷開連接時(shí)觸發(fā) @Override public void onClose(WebSocket webSocket, int i, String s, boolean b) { logger.info(webSocket.getRemoteSocketAddress() + "客戶端與服務(wù)器斷開連接"); localSockets.remove(webSocket); } //接收到消息時(shí)觸發(fā) @Override public void onMessage(WebSocket webSocket, String s) { logger.info("收到了客戶端的消息:" + s); sendMessage(webSocket,"孩子們,我收到消息了"); } //連接發(fā)送錯(cuò)誤時(shí)調(diào)用,后觸發(fā)onClose方法 @Override public void onError(WebSocket webSocket, Exception e) { logger.info(webSocket.getRemoteSocketAddress() + "客戶端與服務(wù)器連接發(fā)送錯(cuò)誤"); localSockets.remove(webSocket); } @Override public void onStart() { logger.info("孩子們我要啟動(dòng)了?。?); } }; socketServer.start(); logger.info("Man!what can I say,我已經(jīng)啟動(dòng)了"); } /** * 一對(duì)一發(fā)送 * @param webSocket:客戶端 * @param message:信息 */ public void sendMessage(WebSocket webSocket,String message){ logger.info("發(fā)送給"+webSocket.getRemoteSocketAddress().getPort() + "的p2p消息是:" + message); webSocket.send(message); } /** * 一對(duì)多發(fā)送 * @param message:信息 */ public void broatcast(String message){ if (localSockets.size() == 0 || Strings.isNullOrEmpty(message)) return; logger.info("張開第三只眼"); for (WebSocket webSocket : localSockets){ this.sendMessage(webSocket,message); } logger.info("孩子們我燃盡了"); } }
客戶端:
package com.blockchain.qgy.network.websocket; import com.blockchain.qgy.util.Strings; import org.java_websocket.WebSocket; import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.net.URI; import java.util.ArrayList; import java.util.List; @Component public class P2pPointClient { //日志記錄 private Logger logger = LoggerFactory.getLogger(P2pPointClient.class); //服務(wù)器端的地址 private String wsUrl = "ws://localhost:7001/"; //所有連接到客戶端的WebSocket緩存器 private List<WebSocket> localSockets = new ArrayList<>(); public List<WebSocket> getLocalSockets() { return localSockets; } public void setLocalSockets(List<WebSocket> localSockets) { this.localSockets = localSockets; } @PostConstruct @Order(2) public void connectServer(){ try { final WebSocketClient socketClient = new WebSocketClient(new URI(wsUrl)) { @Override public void onOpen(ServerHandshake serverHandshake) { sendMessage(this,"孩子們,我是客戶端"); localSockets.add(this); } @Override public void onMessage(String s) { logger.info("收到服務(wù)器發(fā)來的信息:"+s); } @Override public void onClose(int i, String s, boolean b) { logger.info("斷開連接"); localSockets.remove(this); } @Override public void onError(Exception e) { logger.info("連接錯(cuò)誤"); localSockets.remove(this); } }; socketClient.connect(); } catch (Exception e) { e.printStackTrace(); logger.info("連接錯(cuò)誤"); } } /** * 一對(duì)一發(fā)送 * @param webSocket:客戶端 * @param message:信息 */ public void sendMessage(WebSocket webSocket,String message){ logger.info("發(fā)送給"+webSocket.getRemoteSocketAddress().getPort() + "的p2p消息是:" + message); webSocket.send(message); } /** * 一對(duì)多發(fā)送 * @param message:信息 */ public void broatcast(String message){ if (localSockets.size() == 0 || Strings.isNullOrEmpty(message)) return; logger.info("張開第三只眼"); for (WebSocket webSocket : localSockets){ this.sendMessage(webSocket,message); } logger.info("孩子們我燃盡了"); } }
總結(jié)
到此這篇關(guān)于Java springBoot初步使用websocket的文章就介紹到這了,更多相關(guān)springBoot使用websocket內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring SpringMVC在啟動(dòng)完成后執(zhí)行方法源碼解析
這篇文章主要介紹了SpringMVC在啟動(dòng)完成后執(zhí)行方法源碼解析,還是非常不錯(cuò)的,在這里分享給大家,需要的朋友可以參考下。2017-09-09微服務(wù)架構(gòu)設(shè)計(jì)RocketMQ進(jìn)階事務(wù)消息原理詳解
這篇文章主要介紹了為大家介紹了微服務(wù)架構(gòu)中RocketMQ進(jìn)階層面事務(wù)消息的原理詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助2021-10-10實(shí)例解析Json反序列化之ObjectMapper(自定義實(shí)現(xiàn)反序列化方法)
這篇文章主要介紹了實(shí)例解析Json反序列化之ObjectMapper,json自定義序列化的方法,需要的朋友可以了解下。2017-09-09