// build.gradle
...
dependencies {
...
implementation 'org.springframework.boot:spring-boot-starter-websocket'
...
}
...
// WebSocketHandler.java
@Component
public class WebSocketHandler extends TextWebSocketHandler {
private static final ConcurrentHashMap<String, WebSocketSession> CLIENTS = new ConcurrentHashMap<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
CLIENTS.put(session.getId(), session);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
CLIENTS.remove(session.getId());
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String id = session.getId(); // 세션 ID
CLIENTS.entrySet().forEach( arg-> {
if (!arg.getKey().equals(id)) { // 같은 아이디가 아니면 메시지 전달
try {
arg.getValue().sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
// WebSocketConfig.java
@Configuration
@EnableWebSocket
@RequiredArgsConstructor
public class WebSocketConfig implements WebSocketConfigurer {
private final WebSocketHandler webSocketHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(webSocketHandler, "/chat").setAllowedOrigins("*");
}
}
PostMan을 사용해 ws://localhost:8080/chat
로 접속
정상 접속이 확인된다.
동일한 창을 두개 띄우고 두 창 모두 ws://localhost:8080/chat
로 접속
첫번째 창에서 메세지 전송
두번째 창에서 수신 확인
두번째 창에서 답신 전송
첫번째 창에서 메세지 수신 확인