Java?springBoot初步使用websocket的代碼示例
一、什么是websocket
WebSocket是一種在Web應(yīng)用程序中實(shí)現(xiàn)實(shí)時(shí)雙向通信的協(xié)議。它為瀏覽器和服務(wù)器之間提供了一種持久連接,在一個(gè)連接上可以雙向傳輸數(shù)據(jù)。相比傳統(tǒng)的HTTP協(xié)議,WebSocket具有更低的延遲和更高的效率。
WebSocket使用了類(lèi)似于握手的方式來(lái)建立連接。在握手過(guò)程中,瀏覽器和服務(wù)器會(huì)交換一些信息,以建立一個(gè)WebSocket連接。一旦連接建立,瀏覽器和服務(wù)器之間就可以實(shí)時(shí)地傳輸數(shù)據(jù),而不需要每次都發(fā)起新的HTTP請(qǐng)求。
WebSocket協(xié)議可以在不同的平臺(tái)和編程語(yǔ)言中實(shí)現(xiàn),包括Web瀏覽器和服務(wù)器端。在Web瀏覽器中,可以使用JavaScript中的WebSocket API來(lái)實(shí)現(xiàn)WebSocket連接。在服務(wù)器端,可以使用各種編程語(yǔ)言和框架來(lái)實(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)用程序。通過(guò)WebSocket,開(kāi)發(fā)人員可以更加方便地實(shí)現(xiàn)實(shí)時(shí)通信功能,提高用戶(hù)體驗(yàn)。
這里我們使用Java配合springboot2進(jìn)行使用。
二、依賴(lài)坐標(biāo)地址
1.springBoot父級(jí)依賴(lài)
<!--依賴(lài)的父級(jí)工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.6</version>
<relativePath/>
</parent>2.springBoot依賴(lài)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>3.webSocket依賴(lài)
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.3.8</version>
</dependency>三、代碼
不多說(shuō)了,直接拿去看吧,都在注釋里面了。
服務(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,"孩子們,我回來(lái)了!");
localSockets.add(webSocket);
}
//斷開(kāi)連接時(shí)觸發(fā)
@Override
public void onClose(WebSocket webSocket, int i, String s, boolean b) {
logger.info(webSocket.getRemoteSocketAddress() + "客戶(hù)端與服務(wù)器斷開(kāi)連接");
localSockets.remove(webSocket);
}
//接收到消息時(shí)觸發(fā)
@Override
public void onMessage(WebSocket webSocket, String s) {
logger.info("收到了客戶(hù)端的消息:" + s);
sendMessage(webSocket,"孩子們,我收到消息了");
}
//連接發(fā)送錯(cuò)誤時(shí)調(diào)用,后觸發(fā)onClose方法
@Override
public void onError(WebSocket webSocket, Exception e) {
logger.info(webSocket.getRemoteSocketAddress() + "客戶(hù)端與服務(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:客戶(hù)端
* @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("張開(kāi)第三只眼");
for (WebSocket webSocket : localSockets){
this.sendMessage(webSocket,message);
}
logger.info("孩子們我燃盡了");
}
}
客戶(hù)端:
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/";
//所有連接到客戶(hù)端的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,"孩子們,我是客戶(hù)端");
localSockets.add(this);
}
@Override
public void onMessage(String s) {
logger.info("收到服務(wù)器發(fā)來(lái)的信息:"+s);
}
@Override
public void onClose(int i, String s, boolean b) {
logger.info("斷開(kāi)連接");
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:客戶(hù)端
* @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("張開(kāi)第三只眼");
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)文章希望大家以后多多支持腳本之家!
- SpringBoot分布式WebSocket的實(shí)現(xiàn)指南
- SpringBoot實(shí)現(xiàn)WebSocket通信過(guò)程解讀
- 深入淺出SpringBoot WebSocket構(gòu)建實(shí)時(shí)應(yīng)用全面指南
- 利用SpringBoot與WebSocket實(shí)現(xiàn)實(shí)時(shí)雙向通信功能
- Springboot整合WebSocket 實(shí)現(xiàn)聊天室功能
- vue+springboot+webtrc+websocket實(shí)現(xiàn)雙人音視頻通話(huà)會(huì)議(最新推薦)
- Springboot使用Websocket的時(shí)候調(diào)取IOC管理的Bean報(bào)空指針異常問(wèn)題
- SpringBoot3整合WebSocket詳細(xì)指南
- SpringBoot實(shí)現(xiàn)WebSocket的示例代碼
- Spring Boot集成WebSocket項(xiàng)目實(shí)戰(zhàn)的示例代碼
相關(guān)文章
Java程序設(shè)計(jì)之12個(gè)經(jīng)典樣例
這篇文章主要給大家分享關(guān)于Java程序設(shè)計(jì)11個(gè)經(jīng)典樣例,主要以舉例的形式詳細(xì)的講解了Java程序設(shè)計(jì)的各種方法,需要的朋友可以參考一下文章具體的內(nèi)容2021-10-10
SpringBoot集成vue的開(kāi)發(fā)解決方案
這篇文章主要介紹了SpringBoot集成vue的開(kāi)發(fā)解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
spring中@Transactional注解和事務(wù)的實(shí)戰(zhàn)
本文主要介紹了spring中@Transactional注解和事務(wù)的實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-07-07
Java實(shí)現(xiàn)兩人五子棋游戲(五) 判斷是否有一方勝出
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)兩人五子棋游戲,判斷是否有一方勝出,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
Spring Boot定時(shí)器創(chuàng)建及使用解析
這篇文章主要介紹了Spring Boot定時(shí)器創(chuàng)建及使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07

