一、搭建环境
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>4.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
<version>4.1.9.RELEASE</version>
</dependency>
SpringMVC配置websocket有两种方式,一种是基于注解,一种是基于xml。这里我采用注解方式配置。
二、创建配置类
package com..websocket;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
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;
@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(systemWebSocketHandler(), "/webSocketServer").addInterceptors(new HandshakeInterceptor());
}
@Bean
public WebSocketHandler systemWebSocketHandler() {
return new ServerWebSocketHandle();
}
}
这里使用的config配置的形式注册bean和配置,所以需要在SpringMVC的配置文件中添加对类的自动扫描:
<mvc:annotation-driven />
<context:component-scan base-package="com.websocket"/>
三、消息处理类
package com.websocket;
import com.component.ComToClientComponent;
import org.springframework.beans.factory.annotation.Autowired;
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 ServerWebSocketHandle extends TextWebSocketHandler {
@Autowired
ComToClientComponent comToClientComponent;
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
//super.afterConnectionEstablished(session);
comToClientComponent.openHandler(session);
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
//System.out.println(message.getPayload());
//super.handleTextMessage(session, message);
//session.sendMessage(new TextMessage(message.getPayload().toLowerCase()));
comToClientComponent.messageHandler(session, message);
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
super.handleTransportError(session, exception);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
//super.afterConnectionClosed(session, status);
comToClientComponent.closeHandler(session);
}
}
四、拦截器类
package com.websocket;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
import java.util.Map;
public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor{
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
return super.beforeHandshake(request, response, wsHandler, attributes);
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
super.afterHandshake(request, response, wsHandler, ex);
}
}
参考:
https://blog.youkuaiyun.com/mybook201314/article/details/70173674