本篇文章给大家分享的是有关使用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怎么实现一个应用,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4185276/blog/3103007