千家信息网

使用webSocket与spring怎么实现一个应用

发表于:2024-11-28 作者:千家信息网编辑
千家信息网最后更新 2024年11月28日,本篇文章给大家分享的是有关使用webSocket与spring怎么实现一个应用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.spri
千家信息网最后更新 2024年11月28日使用webSocket与spring怎么实现一个应用

本篇文章给大家分享的是有关使用webSocket与spring怎么实现一个应用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

1.spring-websocket依赖包



4.0.2.RELEASE


org.springframework
spring-websocket
${spring.version}


org.springframework
spring-messaging
${spring.version}

2 sping配置文件

                                                                                                                                                                                                                                                                     

其中命名空间

xmlns:websocket="http://www.springframework.org/schema/websocket"

以及引入的功能

  1. http://www.springframework.org/schema/websocket

  2. http://www.springframework.org/schema/websocket/spring-websocket-4.0.xsd

3.继承TextWebSocketHandler

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);                        }                }                                       }}

4.继承HttpSessionHandshakeInterceptor

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 arg3) throws Exception {                logger.info("握手完成前...");                return super.beforeHandshake(arg0, arg1, arg2, arg3);        }}

5.服务注册

注解模式:

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@EnableWebSocketpublic 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内使用元素,WebMvcConfigurerAdapter配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制.
XML配置模式:

                                                                                                                                                 

6.页面

WebSocket  

以上就是使用webSocket与spring怎么实现一个应用,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

0