基于spring框架來寫的,websocket實(shí)時(shí)推送例子,具體內(nèi)容如下
專業(yè)領(lǐng)域包括網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、商城網(wǎng)站建設(shè)、微信營(yíng)銷、系統(tǒng)平臺(tái)開發(fā), 與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開發(fā)公司不同,創(chuàng)新互聯(lián)的整合解決方案結(jié)合了幫做網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營(yíng)銷的理念,并將策略和執(zhí)行緊密結(jié)合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。
第一步:自己搭建一個(gè)springmvc項(xiàng)目,很簡(jiǎn)單,網(wǎng)上百度都有;pom文件添加以下:
<!-- WebSocket --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-messaging</artifactId> <version>4.2.4.RELEASE</version> </dependency>
我的spring版本是4.2.4的,所以websocket也是4.2.4的;websocket最好和spring版本保持一致
第二步:編寫消息處理器
/** * Project Name:springRabbitMQ * File Name:MyMessageHandler.java * Package Name:com.zsy.websocket * Date:2018年1月31日上午11:10:03 * Copyright (c) 2018, zhaoshouyun All Rights Reserved. * */ package com.zsy.websocket; import java.io.IOException; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.lang3.StringUtils; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.WebSocketMessage; import org.springframework.web.socket.WebSocketSession; /** * ClassName: MyMessageHandler * Function: 實(shí)現(xiàn)webscoket接口 * date: 2018年1月31日 上午11:10:03 * @author zhaoshouyun * @version * @since JDK 1.7 */ public class MyMessageHandler implements WebSocketHandler { //用戶key public static final String USER_KEY = "current_user"; /** * userMap:存儲(chǔ)用戶連接webscoket信息 * @since JDK 1.7 */ private final static Map<String, WebSocketSession> userMap; static { userMap = new ConcurrentHashMap<String,WebSocketSession>(30); } /** * 關(guān)閉websocket時(shí)調(diào)用該方法 * @see org.springframework.web.socket.WebSocketHandler#afterConnectionClosed(org.springframework.web.socket.WebSocketSession, org.springframework.web.socket.CloseStatus) */ @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { String userId = this.getUserId(session); if(StringUtils.isNoneBlank(userId)){ userMap.remove(userId); System.err.println("該" + userId +"用戶已成功關(guān)閉"); }else{ System.err.println("關(guān)閉時(shí),獲取用戶id為空"); } } /** * 建立websocket連接時(shí)調(diào)用該方法 * @see org.springframework.web.socket.WebSocketHandler#afterConnectionEstablished(org.springframework.web.socket.WebSocketSession) */ @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { String userId = this.getUserId(session); if(StringUtils.isNoneBlank(userId)){ userMap.put(userId, session); session.sendMessage(new TextMessage("建立WebSocket連接成功!")); } } /** * 客戶端調(diào)用websocket.send時(shí)候,會(huì)調(diào)用該方法,進(jìn)行數(shù)據(jù)通信 * @see org.springframework.web.socket.WebSocketHandler#handleMessage(org.springframework.web.socket.WebSocketSession, org.springframework.web.socket.WebSocketMessage) */ @Override public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { String msg = message.toString(); String userId = this.getUserId(session); System.err.println("該"+userId+"用戶發(fā)送的消息是:"+msg); message = new TextMessage("服務(wù)端已經(jīng)接收到消息,msg="+msg); session.sendMessage(message); } /** * 傳輸過程出現(xiàn)異常時(shí),調(diào)用該方法 * @see org.springframework.web.socket.WebSocketHandler#handleTransportError(org.springframework.web.socket.WebSocketSession, java.lang.Throwable) */ @Override public void handleTransportError(WebSocketSession session, Throwable e) throws Exception { WebSocketMessage<String> message = new TextMessage("異常信息:"+e.getMessage()); session.sendMessage(message); } /** * * @see org.springframework.web.socket.WebSocketHandler#supportsPartialMessages() */ @Override public boolean supportsPartialMessages() { return false; } /** * sendMessageToUser:發(fā)給指定用戶 * @author zhaoshouyun * @param userId * @param contents * @since JDK 1.7 */ public void sendMessageToUser(String userId,String contents) { WebSocketSession session = userMap.get(userId); if(session !=null && session.isOpen()) { try { TextMessage message = new TextMessage(contents); session.sendMessage(message); } catch (IOException e) { e.printStackTrace(); } } } /** * sendMessageToAllUsers:發(fā)給所有的用戶 * @author zhaoshouyun * @param contents * @since JDK 1.7 */ public void sendMessageToAllUsers(String contents) { Set<String> userIds = userMap.keySet(); for(String userId: userIds) { this.sendMessageToUser(userId, contents); } } /** * getUserId:獲取用戶id * @author zhaoshouyun * @param session * @return * @since JDK 1.7 */ private String getUserId(WebSocketSession session){ try { String userId = (String)session.getAttributes().get(USER_KEY); return userId; } catch (Exception e) { e.printStackTrace(); } return null; } }
第三步:編寫websocket相關(guān)配置,當(dāng)然可以在xml配置;我現(xiàn)在沒有使用xml配置,使用代碼配置,需要在xml里添加掃描包<context:component-scan base-package="com.zsy.websocket" />
/** * Project Name:springRabbitMQ * File Name:WebSocketConfig.java * Package Name:com.zsy.websocket * Date:2018年1月31日下午1:10:33 * Copyright (c) 2018, zhaoshouyun All Rights Reserved. * */ /** * Project Name:springRabbitMQ * File Name:WebSocketConfig.java * Package Name:com.zsy.websocket * Date:2018年1月31日下午1:10:33 * Copyright (c) 2018, zhaoshouyun All Rights Reserved. * */ package com.zsy.websocket; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; /** * ClassName: WebSocketConfig * Function: TODO ADD FUNCTION. * date: 2018年1月31日 下午1:10:33 * @author zhaoshouyun * @version * @since JDK 1.7 */ @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { /** * 注冊(cè)handle * @see org.springframework.web.socket.config.annotation.WebSocketConfigurer#registerWebSocketHandlers(org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry) */ @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myHandler(), "/testHandler").addInterceptors(new WebSocketInterceptor()); registry.addHandler(myHandler(), "/socketJs/testHandler").addInterceptors(new WebSocketInterceptor()).withSockJS(); } @Bean public WebSocketHandler myHandler(){ return new MyMessageHandler(); } }
第四步:編寫websocket適配器
package com.zsy.websocket; import java.util.Map; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; /** * ClassName: WebSocketInterceptor * Function: TODO ADD FUNCTION. * date: 2018年1月31日 上午11:42:34 * @author zhaoshouyun * @version * @since JDK 1.7 */ public class WebSocketInterceptor extends HttpSessionHandshakeInterceptor { /** * TODO 簡(jiǎn)單描述該方法的實(shí)現(xiàn)功能(可選). * @see org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor#beforeHandshake(org.springframework.http.server.ServerHttpRequest, org.springframework.http.server.ServerHttpResponse, org.springframework.web.socket.WebSocketHandler, java.util.Map) */ @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { if(request instanceof ServletServerHttpRequest){ ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest)request; //獲取參數(shù) String userId = serverHttpRequest .getServletRequest().getParameter("userId"); attributes.put(MyMessageHandler.USER_KEY, userId); } return true; } }
第五步對(duì)應(yīng)的js:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> <script type="text/javascript"> var websocket; // 首先判斷是否 支持 WebSocket if('WebSocket' in window) { websocket = new WebSocket("ws://localhost:8085/springTest/testHandler?userId=zhaoshouyun"); } else if('MozWebSocket' in window) { websocket = new MozWebSocket("ws://localhost:8085/springTest/testHandler?userId=zhaoshouyun"); } else { websocket = new SockJS("http://localhost:8085/springTest/socketJs/testHandler?userId=zhaoshouyun"); } // 打開連接時(shí) websocket.onopen = function(evnt) { console.log(" websocket.onopen "); }; // 收到消息時(shí) websocket.onmessage = function(evnt) { alert(evnt.data); }; websocket.onerror = function(evnt) { console.log(" websocket.onerror "); }; websocket.onclose = function(evnt) { console.log(" websocket.onclose "); }; function say(){ //客戶端主動(dòng)發(fā)消息 websocket.send(document.getElementById('msg').value); } </script> </head> <body> <input type="text" value="" id="msg"><button onclick="say()"></button> </body> </html>
第六步測(cè)試:
package com.zsy.test.controller; import java.util.HashMap; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.zsy.websocket.MyMessageHandler; /** * ClassName: TestController * Function: TODO ADD FUNCTION. * date: 2017年12月14日 上午11:11:23 * @author zhaoshouyun * @version * @since JDK 1.7 */ @Controller public class TestController { @Autowired MyMessageHandler handler; @RequestMapping("/get") public String get(){ return "index"; } @ResponseBody @RequestMapping("/get1") public String send(String name){ handler.sendMessageToUser("zhaoshouyun", "服務(wù)端發(fā)送的內(nèi)容:"+name); return "success"; } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
當(dāng)前題目:基于spring實(shí)現(xiàn)websocket實(shí)時(shí)推送實(shí)例
文章位置:http://aaarwkj.com/article28/pjchjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、網(wǎng)站收錄、搜索引擎優(yōu)化、定制開發(fā)、網(wǎng)站建設(shè)、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)