增加 websocket相关代码
parent
36811b937d
commit
c0e303dbf0
@ -0,0 +1,67 @@
|
||||
package com.hchbox.config;
|
||||
|
||||
import com.hchbox.exception.TaoMiCommException;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
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.TextWebSocketHandler;
|
||||
|
||||
/**
|
||||
* @author Enzo
|
||||
* @date : 2021/7/5
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class HttpAuthHandler extends TextWebSocketHandler {
|
||||
|
||||
/**
|
||||
* socket 建立成功事件
|
||||
*
|
||||
* @param session session
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
|
||||
Object token = session.getAttributes().get("nickname");
|
||||
if (token != null) {
|
||||
// 用户连接成功,放入在线用户缓存
|
||||
WsSessionManager.add(token.toString(), session);
|
||||
} else {
|
||||
throw new TaoMiCommException("用户登录已经失效!");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 接收消息事件
|
||||
*
|
||||
* @param session
|
||||
* @param message
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
|
||||
super.handleTextMessage(session, message);
|
||||
}
|
||||
|
||||
/**
|
||||
* socket 断开连接时
|
||||
*
|
||||
* @param session
|
||||
* @param status
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
|
||||
Object sessionKey = session.getAttributes().get("nickname");
|
||||
if (sessionKey != null) {
|
||||
// 用户退出,移除缓存
|
||||
WsSessionManager.remove(sessionKey.toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package com.hchbox.config;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
|
||||
|
||||
/**
|
||||
* @author Enzo
|
||||
* @date : 2021/7/5
|
||||
*/
|
||||
@Configuration
|
||||
public class WebSocketConfig {
|
||||
|
||||
@Bean
|
||||
public ServerEndpointExporter serverEndpointExporter () {
|
||||
return new ServerEndpointExporter();
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,88 @@
|
||||
package com.hchbox.config;
|
||||
|
||||
import com.hchbox.exception.TaoMiCommException;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.socket.TextMessage;
|
||||
import org.springframework.web.socket.WebSocketSession;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
* @author Enzo
|
||||
* @date : 2021/7/5
|
||||
*/
|
||||
@Slf4j
|
||||
public class WsSessionManager {
|
||||
|
||||
private WsSessionManager() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存连接 session 的地方
|
||||
*/
|
||||
private static final ConcurrentHashMap<String, WebSocketSession> SESSION_POOL = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* 添加 session
|
||||
*
|
||||
* @param key key
|
||||
*/
|
||||
public static void add(String key, WebSocketSession session) {
|
||||
// 添加 session
|
||||
SESSION_POOL.put(key, session);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除 session,会返回删除的 session
|
||||
*
|
||||
* @param key key
|
||||
* @return 删除
|
||||
*/
|
||||
public static WebSocketSession remove(String key) {
|
||||
// 删除 session
|
||||
return SESSION_POOL.remove(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除并同步关闭连接
|
||||
*
|
||||
* @param key key
|
||||
*/
|
||||
public static void removeAndClose(String key) {
|
||||
WebSocketSession session = remove(key);
|
||||
if (session != null) {
|
||||
try {
|
||||
// 关闭连接
|
||||
session.close();
|
||||
} catch (IOException e) {
|
||||
log.error("close link exception key as {}", key);
|
||||
throw new TaoMiCommException("the remove session error");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得 session
|
||||
*
|
||||
* @param key key
|
||||
* @return 获取session
|
||||
*/
|
||||
public static WebSocketSession get(String key) {
|
||||
// 获得 session
|
||||
return SESSION_POOL.get(key);
|
||||
}
|
||||
|
||||
|
||||
public static void sendMessageToUser(String nickname, TextMessage message) {
|
||||
WebSocketSession session = SESSION_POOL.get(nickname);
|
||||
if (session != null){
|
||||
try {
|
||||
session.sendMessage(message);
|
||||
} catch (IOException e) {
|
||||
log.error("the send message error nickname as {}",nickname);
|
||||
throw new TaoMiCommException("the send message error");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue