网盘源码资源:链接: https://pan.baidu.com/s/1mMhiJUASo2T2id4l3cThnw 密码: c28u
配置步骤:
1、WebSocketConfig.java
@Configuration @ComponentScan(basePackages = {"xxx.xxx.xxx"}) @EnableWebSocket public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { @Resource MyWebSocketHandler handler; public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(handler, "/xxxx/ws.json").addInterceptors(new HandShake()).setAllowedOrigins("*"); registry.addHandler(handler, "/xxxx/ws/sockjs").addInterceptors(new HandShake()).setAllowedOrigins("*").withSockJS(); } }
2、HandShake.java
public class HandShake implements HandshakeInterceptor { public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; ServletServerHttpResponse httpServletResponse = (ServletServerHttpResponse) response; HttpSession session = servletRequest.getServletRequest().getSession(false); // 标记用户 String xxx= (String) servletRequest.getServletRequest().getParameter("xxx"); System.out.println("拦截到请求:xxx" + xxx); HttpServletResponse response1 = httpServletResponse.getServletResponse(); response1.addHeader("Access-Control-Allow-Origin", "*"); CookieUtil.setCookie(response1, "token", xxx); attributes.put("xxx", xxx); return true; } public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { } }
3、MyWebSocketHandler.java
@Component public class MyWebSocketHandler implements WebSocketHandler { public static final Map<String, WebSocketSession> userSocketSessionMap; private Logger logger = Logger.getLogger(this.getClass()); static { userSocketSessionMap = new HashMap<String, WebSocketSession>(); } /** * 建立连接后 */ public void afterConnectionEstablished(WebSocketSession session) throws Exception { String uid = (String) session.getAttributes().get("xxx"); logger.warn("接收到前台消息:" + uid); userSocketSessionMap.put(uid, session); } /** * 消息处理,在客户端通过Websocket API发送的消息会经过这里,然后进行相应的处理 */ public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { String xxx= (String) session.getAttributes().get("xxx"); logger.warn("接收到前台消息" + message.toString() + ",xxx:" + xxx); session.sendMessage(new TextMessage(new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create().toJson(message))); } /** * 消息传输错误处理 */ public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { if (session.isOpen()) { session.close(); } } /** * 关闭连接后 */ public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { String xxx= (String) session.getAttributes().get("xxx"); System.out.println("Websocket:" + xxx+ "已经关闭"); Iterator<Map.Entry<String, WebSocketSession>> it = userSocketSessionMap .entrySet().iterator(); // 移除Socket会话 while (it.hasNext()) { Map.Entry<String, WebSocketSession> entry = it.next(); if (entry.getValue().getId().equals(xxx)) { userSocketSessionMap.remove(entry.getKey()); System.out.println("Socket会话已经移除:用户ID" + entry.getKey()); break; } } } public boolean supportsPartialMessages() { return false; } /** * 给所有在线用户发送消息 * * @param message * @throws IOException */ public void broadcast(final TextMessage message) throws IOException { Iterator<Map.Entry<String, WebSocketSession>> it = userSocketSessionMap .entrySet().iterator(); // 多线程群发 while (it.hasNext()) { final Map.Entry<String, WebSocketSession> entry = it.next(); if (entry.getValue().isOpen()) { // entry.getValue().sendMessage(message); new Thread(new Runnable() { public void run() { try { if (entry.getValue().isOpen()) { entry.getValue().sendMessage(message); } } catch (IOException e) { e.printStackTrace(); } } }).start(); } } } /** * 给某个用户发送消息 * * @param * @param message * @throws IOException */ public void sendMessageToUser(String xxx, TextMessage message) throws IOException { WebSocketSession session = userSocketSessionMap.get(xxx); if (session != null && session.isOpen()) { session.sendMessage(message); logger.warn("给用户:" + xxx+ "发送消息:" + message.toString()); }else{ logger.warn("给用户:" + xxx+ "发送消息:" + message.toString()+"但是session失效"); } } }
4、Message.java
public class Message { //发送者 public Long from; //发送者名称 public String fromName; //接收者 public Long to; //发送的文本 public String text; //发送日期 public Date date; public Long getFrom() { return from; } public void setFrom(Long from) { this.from = from; } public String getFromName() { return fromName; } public void setFromName(String fromName) { this.fromName = fromName; } public Long getTo() { return to; } public void setTo(Long to) { this.to = to; } public String getText() { return text; } public void setText(String text) { this.text = text; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } }