日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

【SpringBoot 】 注解之WebSocket初体验

發(fā)布時間:2024/1/1 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【SpringBoot 】 注解之WebSocket初体验 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

之前用.net的一個開源框架寫了WebSocket的應(yīng)用,剛好pmgo有用到?,F(xiàn)如今需要自己做一個簡易聊天室,前端也寫了一些,服務(wù)端打算用Java(.netcore擼了一天,都沒看出個所以然來,連WebSocket的端口都不知道怎么設(shè)置?_?,雖然下面這個Demo也沒有找到如何設(shè)置。)下面就動手實操吧

一、pom.xml引入包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>

在依賴中添加如上代碼段,引入websocket包。

二、WebSocketUtil

接下來創(chuàng)建一個WebSocketUtil類,用于提供對session鏈接、斷開連接、推送消息的簡單控制。

(注:此處的sendMessage,直接將字符串消息推送給客戶端?,F(xiàn)下先后端分離的應(yīng)用,都采用Json數(shù)據(jù)傳輸標(biāo)準(zhǔn),所以后期最好將其封裝為標(biāo)準(zhǔn)的Json對象)

public class WebsocketUtil {/*** 記錄當(dāng)前在線的Session*/private static final Map<String, Session> ONLINE_SESSION = new ConcurrentHashMap<> ();/*** 添加session* @param userId* @param session*/public static void addSession(String userId, Session session){// 此處只允許一個用戶的session鏈接。一個用戶的多個連接,我們視為無效。 ONLINE_SESSION.putIfAbsent ( userId, session );}/*** 關(guān)閉session* @param userId*/public static void removeSession(String userId){ONLINE_SESSION.remove ( userId );}/*** 給單個用戶推送消息* @param session* @param message*/public static void sendMessage(Session session, String message){if(session == null){return;}// 同步RemoteEndpoint.Async async = session.getAsyncRemote ();async.sendText ( message );}/*** 向所有在線人發(fā)送消息* @param message*/public static void sendMessageForAll(String message) {//jdk8 新方法ONLINE_SESSION.forEach((sessionId, session) -> sendMessage(session, message));} }

三、WebSocketController

如上,已經(jīng)創(chuàng)建好了簡單的session管理和消息管理,接下來要使用注解的方式,使用SpringBoot的websocket包提供的方法,實現(xiàn)OnOpen、OnClose、OnMessage三個方法,再實現(xiàn)一個OnError方法來應(yīng)對異常。代碼段如下:

/*** websocket接口處理類*/ @Component @ServerEndpoint ( value = "/chat/{userid}" ) public class WebsocketController {/*** 連接事件,加入注解* @param userId* @param session*/@OnOpenpublic void onOpen( @PathParam ( value = "userid" ) String userId, Session session ) {String message ="[" + userId + "]加入聊天室!!";// 添加到session的映射關(guān)系中 WebsocketUtil.addSession ( userId, session );// 廣播通知,某用戶上線了 WebsocketUtil.sendMessageForAll ( message );}/*** 連接事件,加入注解* 用戶斷開鏈接* @param userId* @param session*/@OnClosepublic void onClose(@PathParam ( value = "userId" ) String userId, Session session ) {String message ="[" + userId + "]退出了聊天室...";// 刪除映射關(guān)系 WebsocketUtil.removeSession ( userId );// 廣播通知,用戶下線了 WebsocketUtil.sendMessageForAll ( message );}/*** 當(dāng)接收到用戶上傳的消息* @param userId* @param session*/@OnMessagepublic void onMessage(@PathParam ( value = "userId" ) String userId, Session session ,String message) {String msg ="[" + userId + "]:"+message;// 直接廣播 WebsocketUtil.sendMessageForAll ( msg );}/*** 處理用戶活連接異常* @param session* @param throwable*/@OnErrorpublic void onError(Session session, Throwable throwable) {try {session.close();} catch (IOException e) {e.printStackTrace();}throwable.printStackTrace();} }

到此基本完成了websocket的服務(wù)。

四、添加?ServerEndpointExporter 啟動Bean

修改main函數(shù)所在的啟動方法代碼段,添加?serverEndpointExporter?:

public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}/*** 會自動注冊使用了@ServerEndpoint注解聲明的Websocket endpoint* 要注意,如果使用獨立的servlet容器,* 而不是直接使用springboot的內(nèi)置容器,* 就不要注入ServerEndpointExporter,因為它將由容器自己提供和管理。*/@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();} }

至此,完成了所有代碼的編寫。

?

五、測試

使用?http://coolaf.com/tool/chattest?這個站點,來測試鏈接。首先啟動項目,啟動后,點開網(wǎng)址輸入應(yīng)用的WebSocket鏈接url:ws://127.0.0.1:5088/chat/user1 測試鏈接

?

參考文章:https://www.imooc.com/article/68964

?

轉(zhuǎn)載于:https://www.cnblogs.com/lxmajs/p/10746563.html

總結(jié)

以上是生活随笔為你收集整理的【SpringBoot 】 注解之WebSocket初体验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。