本篇文章給大家分享的是有關使用webSocket與spring怎么實現一個應用,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
<properties>
<!-- spring版本號 -->
<spring.version>4.0.2.RELEASE</spring.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
<version>${spring.version}</version>
</dependency>
2 sping配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:websocket="http://www.springframework.org/schema/websocket" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket-4.0.xsd"> <!-- 組件掃描器 --> <context:component-scan base-package="com.gaofei.controller" /> <!-- 注解驅動 --> <mvc:annotation-driven /> <!-- 靜態資源映射 --> <mvc:resources location="/WEB-INF/js/" mapping="/js/**" /> <mvc:resources location="/WEB-INF/css/" mapping="/css/**" /> <!-- 視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> <!-- websocket處理類 --> <bean id="websocketEndPoint" class="com.gaofei.controller.WebsocketEndPoint"/> <websocket:handlers> <websocket:mapping handler="websocketEndPoint" path="/websocket/socketServer.do"/> <websocket:handshake-interceptors> <bean class="com.gaofei.controller.HandInterceptor"/> </websocket:handshake-interceptors> </websocket:handlers> <!-- 注冊 sockJS 采用http協議的 --> <websocket:handlers> <websocket:mapping handler="websocketEndPoint" path="/sockjs/websokect.ws"/> <websocket:handshake-interceptors> <bean class="com.gaofei.controller.HandInterceptor"/> </websocket:handshake-interceptors> <websocket:sockjs /> </websocket:handlers> </beans>
其中命名空間
xmlns:websocket="http://www.springframework.org/schema/websocket"
以及引入的功能
http://www.springframework.org/schema/websocket
http://www.springframework.org/schema/websocket/spring-websocket-4.0.xsd
package com.gaofei.controller; import java.util.Timer; import java.util.TimerTask; import org.apache.log4j.Logger; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; public class WebsocketEndPoint extends TextWebSocketHandler { private Timer timer; private Logger logger=Logger.getLogger(WebsocketEndPoint.class); @Override protected void handleTextMessage(WebSocketSession session,//session中攜帶http請求報文信息 TextMessage message) throws Exception { //接收到消息后,響應消息,處理文本消息 TextMessage returnMessage=new TextMessage("服務端返回報文:"+message.getPayload()); session.sendMessage(returnMessage);//服務器將前端請求信息傳回瀏覽器 super.handleTextMessage(session, message); } @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception {//握手成功后,啟動一個定時器timer logger.info("連接建立后處理方法"); timer=new Timer(true); LoadDataTask task=new LoadDataTask(session); timer.schedule(task,1000,1000);//1s執行一次任務 super.afterConnectionEstablished(session); } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { logger.info("拋出異常時處理方法"); super.handleTransportError(session, exception); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {//連接關閉后 logger.info("連接已關閉"); timer.cancel(); logger.info("連接關閉后處理方法"); super.afterConnectionClosed(session, status); } //內部類實現數據獲取 class LoadDataTask extends TimerTask{ private WebSocketSession session; public WebSocketSession getSession() { return session; } public void setSession(WebSocketSession session) { this.session = session; } public LoadDataTask() { super(); } public LoadDataTask(WebSocketSession session) {//系統將當前建立連接后的session傳遞給內部類的session,達到session共享 super(); this.session = session; } @Override public void run() {//啟動多線程 int i=0; String taskCommand="定時執行任務"+ ++i; TextMessage textMessage = new TextMessage(taskCommand); try { handleTextMessage(session, textMessage);//定時調用handleTextMessage方法,向前端發送信息 } catch (Exception e) { e.printStackTrace(); logger.error(e.getMessage(),e); } } } }
package com.gaofei.controller; import java.util.Map; import org.apache.log4j.Logger; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.server.HandshakeInterceptor; import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; /** * 攔截器(握手) */ public class HandInterceptor extends HttpSessionHandshakeInterceptor { private Logger logger=Logger.getLogger(HandshakeInterceptor.class); @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) { logger.info("創建握手后..."); super.afterHandshake(request, response, wsHandler, ex); } @Override public boolean beforeHandshake(ServerHttpRequest arg0, ServerHttpResponse arg1, WebSocketHandler arg2, Map<String, Object> arg3) throws Exception { logger.info("握手完成前..."); return super.beforeHandshake(arg0, arg1, arg2, arg3); } }
package com.gaofei.controller; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { //支持websocket registry.addHandler(new WebsocketEndPoint(),"/websocket/socketServer.do").addInterceptors(new HandInterceptor()); //支持sockjs registry.addHandler(new WebsocketEndPoint(),"/sockjs/socketServer.do").addInterceptors(new HandInterceptor()).withSockJS(); } }
注:該類需要放在SpringMVC掃描路徑下
@Configuration 指明該類為Spring配置類
@EnableWebSocket 聲明該類支持WebSocket
說明: 網上有很多文章配置中添加了一個注解@EnableWebMvc和繼承了WebMvcConfigurerAdapter,其中@EnableWebMVC注解用來開啟Web MVC的配置支持.相當于DispatcherServlet context內使用<mvc:annotation-driven>元素,WebMvcConfigurerAdapter配置類其實是Spring內部的一種配置方式,采用JavaBean的形式來代替傳統的xml配置文件形式進行針對框架個性化定制.
XML配置模式:
<!-- websocket處理類 --> <bean id="websocketEndPoint" class="com.gaofei.controller.WebsocketEndPoint"/> <websocket:handlers> <websocket:mapping handler="websocketEndPoint" path="/websocket/socketServer.do"/> <websocket:handshake-interceptors> <bean class="com.gaofei.controller.HandInterceptor"/> </websocket:handshake-interceptors> </websocket:handlers> <!-- 注冊 sockJS 采用http協議的 --> <websocket:handlers> <websocket:mapping handler="websocketEndPoint" path="/sockjs/websokect.ws"/> <websocket:handshake-interceptors> <bean class="com.gaofei.controller.HandInterceptor"/> </websocket:handshake-interceptors> <websocket:sockjs /> </websocket:handlers>
<!DOCTYPE> <html> <head> <base href="<%=basePath%>"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>WebSocket</title> </head> <script src="https://cdn.jsdelivr.net/npm/sockjs-client@1/dist/sockjs.min.js"></script> <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script> <script type="text/javascript"> //加載websocket數據 function WebSocketTest(){ if ("WebSocket" in window){ alert("您的瀏覽器支持 WebSocket!"); // 打開一個 web socket var ws = new WebSocket("ws://localhost:8080/webSocketServer/websocket/socketServer.do"); ws.onopen = function(){ // Web Socket 已連接上,使用 send() 方法發送數據 ws.send("發送數據"); alert("數據發送中..."); }; ws.onmessage = function (evt){ var received_msg = evt.data; console.log(received_msg); }; ws.onclose = function(){ // 關閉 websocket alert("連接已關閉..."); }; } } </script> <body> <div id="sse"> <a href="javascript:WebSocketTest()">運行 WebSocket</a> </div> </body> </html>
以上就是使用webSocket與spring怎么實現一個應用,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。