电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Springboot+WebSocket實現一對一聊天和公告的示例代碼

瀏覽:108日期:2023-03-15 14:21:52

1.POM文件導入Springboot整合websocket的依賴

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

2.注冊WebSocket的Bean交給Spring容器管理

@Configurationpublic class WebSocketServiceConfig { @Bean public ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter(); }}

3.WebSocket服務端實現

@ServerEndpoint 注解聲明為一個WebSocket服務,訪問地址為/chat/{username},@Component將其注冊為Spring的一個組件,交給Spring進行管理

@ServerEndpoint('/chat/{username}')@Component@Slf4jpublic class WebSocket { //注入dao或者service,注意:因為dao層接口和service層都是單例的Bean //webSocket 不是單例的,所以在注入dao或者service時,需要用set方法對其進行注入,保證每一個都是獨立的 private static ChatMapper chatMapper; //參數中的ChatMapper 是 單例池中的ChatMapper @Autowired public void setChatMapper(ChatMapper chatMapperBean){WebSocket.chatMapper = chatMapperBean; } //當前連接數 private static int onLinePersonNum; //定義為Map結構,key值代表用戶名稱或其他唯一標識,Value代表對應的WebSocket連接。 //ConcurrentHashMap 保證線程安全,用來存放每個客戶端對應的WebSocket對象 private static Map<String,WebSocket> webSocketMap = new ConcurrentHashMap<String, WebSocket>(); //用戶名 private String username; //當前httpSession private Session session; /** * 打開鏈接 * @param username * @param session */ @OnOpen public void openConnect(@PathParam('username')String username, Session session){this.session = session;this.username = username;//在線連接數+1onlinePerNumAdd();//用戶名和當前用戶WebSocket對象放進Map中webSocketMap.put(this.username,this);log.info('{}連接服務器成功。。。。',this.username); } /** * 關閉連接 * @param username * @param session * @PathParam 用來獲取路徑中的動態參數Key值 */ @OnClose public void closeConnect(@PathParam('username')String username, Session session){webSocketMap.remove(username);//在線連接數-1onlinePerNumSub();log.info('{} 斷開連接。。。',username); } /** * 錯誤提示 */ @OnError public void errorConnect(Session session, Throwable error){log.error('websocket連接異常:{}',error.getMessage()); } @OnMessage public void send(String message, Session session) throws IOException {ObjectMapper objectMapper = new ObjectMapper();Map map = objectMapper.readValue(message, Map.class);sendMessage(map.get('username').toString(),message); } /** * 點對點發送 * @param username * @param message * @throws IOException */ private void sendMessage(String username,String message) throws IOException {WebSocket webSocket = webSocketMap.get(username);webSocket.session.getBasicRemote().sendText(message); } /** * 廣播類型發送 * @param message * @throws IOException */ private void sendMessage(String message) throws IOException {Set<String> keys = webSocketMap.keySet();for (String key : keys) { WebSocket webSocket = webSocketMap.get(key); webSocket.sendMessage(message);} } private synchronized static void onlinePerNumAdd(){WebSocket.onLinePersonNum ++; } private synchronized static void onlinePerNumSub(){WebSocket.onLinePersonNum --; } private synchronized static int getOnLinePerNum(){return WebSocket.onLinePersonNum; }}

4.webSocket客戶端

chat1.html

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>Title</title> <!-- <script src='https://heerey525.github.io/layui-v2.4.3/layui/layui.js'></script>--> <script src='https://cdn.bootcss.com/jquery/3.4.1/jquery.js'></script></head><body><!--<button onclick='connect()'>連接</button>--><input type='text'/><input type='text'/><button onclick='send()'>發送</button><div id='message'></div></body><script type='text/javascript'> var websocket = null; // function connect() { //判斷當前瀏覽器是否支持WebSocket ,主要此處要更換為自己的地址 if(’WebSocket’ in window){ websocket = new WebSocket('ws://localhost:8089/chat/bbb'); } else{ alert(’Not support websocket’) } //連接發生錯誤的回調方法 websocket.onerror = function(){ // setMessageInnerHTML('error'); }; //連接成功建立的回調方法 websocket.onopen = function(event){ console.log('連接成功?。。?) // setMessageInnerHTML('open'); $('#link').val('連接成功??!') } //連接關閉的回調方法 websocket.onclose = function(){ // setMessageInnerHTML('close'); } //監聽窗口關閉事件,當窗口關閉時,主動去關閉websocket連接,防止連接還沒斷開就關閉窗口,server端會拋異常。 window.onbeforeunload = function(){ websocket.close(); } //發送消息 function send(){ websocket.send('aaa'); // onmessage(); } //接收到消息的回調方法 // function onmessage(){ websocket.onmessage = function(event){ console.log(event.data) // setMessageInnerHTML(event.data); $('#message').append('<h1>'+ event.data + '</h1>') // } }</script></html>

chat2.html

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>Title</title><!-- <script src='https://heerey525.github.io/layui-v2.4.3/layui/layui.js'></script>--> <script src='https://cdn.bootcss.com/jquery/3.4.1/jquery.js'></script></head><body><!--<button onclick='connect()'>連接</button>--><input type='text'/><input type='text'/><button onclick='send()'>發送</button><div id='message'></div></body><script type='text/javascript'> var websocket = null; // function connect() {//判斷當前瀏覽器是否支持WebSocket ,主要此處要更換為自己的地址if(’WebSocket’ in window){ websocket = new WebSocket('ws://localhost:8089/pushMsg/aaa');}else{ alert(’Not support websocket’)}//連接發生錯誤的回調方法websocket.onerror = function(){ // setMessageInnerHTML('error');};//連接成功建立的回調方法websocket.onopen = function(event){ console.log('連接成功?。?!') // setMessageInnerHTML('open'); $('#link').val('服務器連接成功??!')}//連接關閉的回調方法websocket.onclose = function(){ // setMessageInnerHTML('close');}//監聽窗口關閉事件,當窗口關閉時,主動去關閉websocket連接,防止連接還沒斷開就關閉窗口,server端會拋異常。window.onbeforeunload = function(){ websocket.close();} //發送消息 function send(){websocket.send('bbb');// onmessage(); } //接收到消息的回調方法 // function onmessage(){websocket.onmessage = function(event){ console.log(event.data) // setMessageInnerHTML(event.data); $('#message').append('<h1>'+ event.data + '</h1>')// } }</script></html>

以上就是具體的代碼實現,對于如果用戶離線,websocket斷開連接的情況,可以采用持久化的存儲方式。例如使用mysql關系型數據庫或Redis緩存等等保存用戶的讀取狀態,當用戶登錄后查詢用戶是否有未讀消息,然后進行推送。

到此這篇關于Springboot+WebSocket實現一對一聊天和公告的示例代碼的文章就介紹到這了,更多相關Springboot WebSocket一對一聊天內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 科研ELISA试剂盒,酶联免疫检测试剂盒,昆虫_植物ELISA酶免试剂盒-上海仁捷生物科技有限公司 | T恤衫定做,企业文化衫制作订做,广告T恤POLO衫定制厂家[源头工厂]-【汉诚T恤定制网】 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | 东莞办公家具厂家直销-美鑫【免费3D效果图】全国办公桌/会议桌定制 | 全自动翻转振荡器-浸出式水平振荡器厂家-土壤干燥箱价格-常州普天仪器 | 登车桥动力单元-非标液压泵站-非标液压系统-深圳市三好科技有限公司 | 耐火浇注料-喷涂料-浇注料生产厂家_郑州市元领耐火材料有限公司 耐力板-PC阳光板-PC板-PC耐力板 - 嘉兴赢创实业有限公司 | 烟台条码打印机_烟台条码扫描器_烟台碳带_烟台数据采集终端_烟台斑马打印机-金鹏电子-金鹏电子 | ISO9001认证咨询_iso9001企业认证代理机构_14001|18001|16949|50430认证-艾世欧认证网 | LOGO设计_品牌设计_VI设计 - 特创易 | 生产自动包装秤_颗粒包装秤_肥料包装秤等包装机械-郑州鑫晟重工科技有限公司 | 无锡网站建设-做网站-建网站-网页设计制作-阿凡达建站公司 | 数显恒温油浴-电砂浴-高温油浴振荡器-常州迈科诺仪器有限公司 | 广州市哲铭油墨涂料有限公司,水性漆生产研发基地 | 贴板式电磁阀-不锈钢-气动上展式放料阀-上海弗雷西阀门有限公司 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 | 合金ICP光谱仪(磁性材料,工业废水)-百科 | 山东集装箱活动房|济南集装箱活动房-济南利森集装箱有限公司 | 动力配电箱-不锈钢配电箱-高压开关柜-重庆宇轩机电设备有限公司 聚天冬氨酸,亚氨基二琥珀酸四钠,PASP,IDS - 远联化工 | 立式矫直机_卧式矫直机-无锡金矫机械制造有限公司 | 深圳公司注册-工商注册代理-注册公司流程和费用_护航财税 | 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | 服务器之家 - 专注于服务器技术及软件下载分享 | 海外整合营销-独立站营销-社交媒体运营_广州甲壳虫跨境网络服务 焊管生产线_焊管机组_轧辊模具_焊管设备_焊管设备厂家_石家庄翔昱机械 | 岸电电源-60HZ变频电源-大功率变频电源-济南诚雅电子科技有限公司 | 订做不锈钢_不锈钢定做加工厂_不锈钢非标定制-重庆侨峰金属加工厂 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 电伴热系统施工_仪表电伴热保温箱厂家_沃安电伴热管缆工业技术(济南)有限公司 | 粉末冶金注射成型厂家|MIM厂家|粉末冶金齿轮|MIM零件-深圳市新泰兴精密科技 | 罗茨真空机组,立式无油往复真空泵,2BV水环真空泵-力侨真空科技 | 昆山PCB加工_SMT贴片_PCB抄板_线路板焊接加工-昆山腾宸电子科技有限公司 | 六维力传感器_六分量力传感器_模腔压力传感器-南京数智微传感科技有限公司 | 安徽免检低氮锅炉_合肥燃油锅炉_安徽蒸汽发生器_合肥燃气锅炉-合肥扬诺锅炉有限公司 | 步入式高低温测试箱|海向仪器 | 导电银胶_LED封装导电银胶_半导体封装导电胶厂家-上海腾烁 | 安驭邦官网-双向万能直角铣头,加工中心侧铣头,角度头[厂家直销] 闸阀_截止阀_止回阀「生产厂家」-上海卡比阀门有限公司 | ERP企业管理系统永久免费版_在线ERP系统_OA办公_云版软件官网 | 广东燎了网络科技有限公司官网-网站建设-珠海网络推广-高端营销型外贸网站建设-珠海专业h5建站公司「了了网」 | 储气罐,真空罐,缓冲罐,隔膜气压罐厂家批发价格,空压机储气罐规格型号-上海申容压力容器集团有限公司 | 温州富欧金属封头-不锈钢封头厂家 | 深圳宣传片制作-企业宣传视频制作-产品视频拍摄-产品动画制作-短视频拍摄制作公司 | 专业深孔加工_东莞深孔钻加工_东莞深孔钻_东莞深孔加工_模具深孔钻加工厂-东莞市超耀实业有限公司 |