背景
????之前介紹過springboot集成webstock方式,具體參考:
springboot集成websocket實戰(zhàn):站內消息實時推送
這里補充另外一個使用webstock的場景,方便其他同學理解和使用,廢話不多說了,直接開始!簡單介紹一下業(yè)務場景:
????現(xiàn)在有一個投票活動,活動詳情中會顯示投票活動的參與人數(shù)、訪問數(shù)、投票數(shù)。這三個投票數(shù)據(jù)需要實時的進行變化,這里就可以使用webstock進行返回頁面。當三個數(shù)據(jù)發(fā)生變化時,服務端發(fā)送最新數(shù)據(jù)給客戶端,客戶端僅進行展示即可,不用輪詢查詢數(shù)據(jù),頁面也會顯示動態(tài)效果。
實現(xiàn)步驟
????1.配置webstock
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
????2.webstocket服務邏輯說明
????每個客戶端進入活動之后需要與服務端建立一個連接,由于是在微信小程序中進行發(fā)布活動,所以使用用戶的openID進行用戶的唯一標識,每個鏈接就可以看做是客戶端與服務端的一次會話session,使用clients將所有登錄的用戶創(chuàng)建的session存儲起來,方便后期進行消息群發(fā)操作,用戶退出時將創(chuàng)建session進行關閉操作。投票數(shù)、訪問量、參與人數(shù),每個指標變化時需要調用webstock服務器中的群發(fā)消息功能,這樣就能保證三個數(shù)據(jù)變化之后客戶端可以實時顯示出最新的數(shù)據(jù),達到最終預期的效果。
????3.webstocket服務代碼實現(xiàn)
@Component
@Slf4j
@Service
@ServerEndpoint("/ws/{openId}")
public class WebSocketServer {
// 每個在線用戶會創(chuàng)建一個WebSocketServer對象
private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
// 存放所有在線的客戶端 key為用戶的唯一標識:userId,value為每個會話連接
private static Map<String, Session> clients = new ConcurrentHashMap<>();
/**
* 連接建立成功調用的方法
*/
@OnOpen
public void onOpen(Session session, @PathParam("openId") String openId) throws IOException {
log.info("dataId:{},已建立連接",openId);
clients.put(openId, session);
webSocketSet.add(this);
}
/**
* 連接關閉調用的方法
*/
@OnClose
public void onClose(Session session,@PathParam("openId") String openId) {
log.info("dataId:{},關閉連接",openId);
clients.remove(openId);
webSocketSet.remove(this); //從set中刪除
}
/**
* @ Param session
* @ Param error
*/
@OnError
public void onError(Session session, Throwable error) {
log.error("發(fā)生錯誤");
error.printStackTrace();
}
/**
* @Author: txm
* @Description: 群發(fā)消息
* @Param: []
* @return: void
* @Date: 2022/12/23 14:28
**/
public void batchSendMsg() throws IOException {
VoteServiceImpl voteService = SpringUtils.getBean(VoteServiceImpl.class);
// 此處是組裝返回類似的參數(shù)信息:{"joinCount":15,"visitCount":169,"voteCount":36}
String voteStatisticsVo = voteService.findVoteStatisticsVo();
for (Map.Entry<String, Session> integerSessionEntry : clients.entrySet()) {
integerSessionEntry.getValue().getBasicRemote().sendText(voteStatisticsVo);
}
}
}
4.業(yè)務邏輯觸發(fā)說明
????這里僅以增加訪問量操作為例進行說明(投票數(shù)增加、參與人數(shù)增加同理,只是業(yè)務觸發(fā)邏輯不同),自定義了一個增加訪問量的接口,前端調用該接口則活動的訪問數(shù)量會進行加一處理,webstock服務群發(fā)消息的處理就需要在這里完成,參考代碼如下:
@Service
@Slf4j
public class VoteServiceImpl implements VoteService {
@Autowired
private WebSocketServer webSocketServer;
public synchronized void updateVisitCount(Integer voteId) throws IOException {
System.out.println("投票活動訪問量增加操作");
// 服務端群發(fā)消息,更新統(tǒng)計數(shù)據(jù)
webSocketServer.batchSendMsg();
}
}
5.客戶端測試地址:http://1json.com/network/ws.html,輸入項目地址.
????調用更新訪問量接口之后,可以看到服務端已經(jīng)將最新的投票統(tǒng)計信息進行了返回處理:
問題說明
????關于配置完成之后測試客戶端不能建立連接問題
????當時在測試的時候也出現(xiàn)過不能建立連接,分析了一下原因是項目中使用了ssl證書配置,也就是項目本身訪問的方式是https訪問,所以不能使用ws協(xié)議進行訪問,需要使用wss協(xié)議進行訪問(兩者的區(qū)別可以類比理解為http與https的區(qū)別),簡單說一下項目配置,沒有為了適配wss單獨做配置(支持https訪問的項目也會支持wss訪問).
配置文件:
server:
port: 8083
servlet:
session:
timeout: PT30M
ssl:
enabled: true
key-store: classpath:config/ssl/*****.com.pfx
key-store-password: *****
keyStoreType: *****
證書路徑:
說一下本地以及測試環(huán)境的訪問方式:
本地訪問:
wss://127.0.0.1:8083/ws/1
服務器訪問(使用ip訪問不通,只能使用域名):文章來源:http://www.zghlxwxcb.cn/news/detail-483206.html
wss://域名:8083/ws/1
????以上是使用webstock實現(xiàn)頁面數(shù)據(jù)實時刷新的實現(xiàn)過程,如果看完感覺有所幫助歡迎評論區(qū)留言或點贊!文章來源地址http://www.zghlxwxcb.cn/news/detail-483206.html
到了這里,關于springboot集成webstock實戰(zhàn):服務端數(shù)據(jù)推送數(shù)據(jù)到客戶端實現(xiàn)實時刷新的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!