本文基于spring-boot-starter-websocket简单的完成收发信息功能,使用spring框架进行实现。
spring:2.0.2,jdk:1.8.202,maven:3.3.9
因为spring和maven有版本匹配的要求,请大家注意自己的版本是否匹配
SocketDemoApplication
package com.lp.socketdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@EnableScheduling
@SpringBootApplication
public class SocketDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SocketDemoApplication.class, args);
}
//处理定时任务报错问题
@Bean
public ThreadPoolTaskScheduler taskScheduler(){
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(10);
taskScheduler.initialize();
return taskScheduler;
}
}
package com.lp.socketdemo.spring;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
import java.util.Map;
/**
* 握手拦截器
*/
@Component
public class MyInterceptor extends HttpSessionHandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception {
System.out.println(request.getRemoteAddress().toString()+"开始握手");
return super.beforeHandshake(request, response, wsHandler, attributes);
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
System.out.println(request.getRemoteAddress().toString()+"完成握手");
super.afterHandshake(request, response, wsHandler, ex);
}
}
package com.lp.socketdemo.spring;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.AbstractWebSocketHandler;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
/**
* websocket 主程序
*/
@Component
public class MyWsHandler extends AbstractWebSocketHandler {
private static Map map;
private static AtomicInteger clientIdMaker;
static {
map = new ConcurrentHashMap<>();
clientIdMaker = new AtomicInteger(0);
}
/**
* 连接建立
* @param session
* @throws Exception
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
SessionBean sb = new SessionBean(session,clientIdMaker.getAndIncrement());
map.put(session.getId(),sb);
System.out.println(map.get(session.getId()).getClientId() +":建立连接");
super.afterConnectionEstablished(session);
}
/**
* 接收信息
* @param session
* @param message
* @throws Exception
*/
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
super.handleTextMessage(session, message);
System.out.println(map.get(session.getId()).getClientId() +":"+message.getPayload());
}
/**
* 传输异常
* @param session
* @param exception
* @throws Exception
*/
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
super.handleTransportError(session, exception);
if(session.isOpen()) {
session.close();
}
map.remove(session.getId());
}
/**
* 连接关闭
* @param session
* @param status
* @throws Exception
*/
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
super.afterConnectionClosed(session, status);
System.out.println(map.get(session.getId()).getClientId() +":关闭连接");
map.remove(session.getId());
}
@Scheduled(fixedRate = 10000)
public void sendMsg() throws IOException{
for (String key: map.keySet()) {
map.get(key).getWebSocketSession().sendMessage(new TextMessage("ws2心跳"));
}
}
}
package com.lp.socketdemo.spring;
import com.lp.socketdemo.java.WebSocketConfig;
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;
import javax.annotation.Resource;
@Configuration
@EnableWebSocket
public class MyWsConfig implements WebSocketConfigurer {
@Resource
MyWsHandler MyWsHandler;
@Resource
MyInterceptor myInterceptor;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(MyWsHandler,"/myWs2").addInterceptors(myInterceptor).setAllowedOrigins("*");
}
}
package com.lp.socketdemo.spring;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;
@Component
public class SessionBean {
private WebSocketSession webSocketSession;
private int clientId;
public SessionBean() {
}
public SessionBean(WebSocketSession webSocketSession, int clientId) {
this.webSocketSession = webSocketSession;
this.clientId = clientId;
}
public WebSocketSession getWebSocketSession() {
return webSocketSession;
}
public void setWebSocketSession(WebSocketSession webSocketSession) {
this.webSocketSession = webSocketSession;
}
public int getClientId() {
return clientId;
}
public void setClientId(int clientId) {
this.clientId = clientId;
}
}
5.前段
websocketTest.html
websocket调试页面
location:
message:
消息记录
课程介绍_WebSocket入门与案例实战-慕课网
最全面的SpringMVC教程(六)——WebSocket_springmvc websocket_小新要变强的博客-CSDN博客