WebSocketHandler
@Component
@Sl4j
public class ChatHandler extends TextWebSocketHandler {
private static List<WebSocketSession> list = new ArrayList<>();
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String payload = message.getPayload();
log.info("payload : " + payload);
for(WebSocketSession sess: list) {
sess.sendMessage(message);
}
}
/* Client가 접속 시 호출되는 메서드 */
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
list.add(session);
log.info(session + " 클라이언트 접속");
}
/* Client가 접속 해제 시 호출되는 메서드드 */
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
log.info(session + " 클라이언트 접속 해제");
list.remove(session);
}
}
afterConnectionEstablished
메서드를 통해서 session
을 list
에 넣고
afterConnectionClosed
메서드를 통해서 session
을 제거한다.
WebSocketConfig
@Configuration
@RequiredArgsConstructor
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
private final ChatHandler chatHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(chatHandler, "chat").setAllowedOrigins("*");
}
}
@EnableWebSocket
애노테이션을 사용해 WebSocket
을 활성화 하고
WebSocket
에 접속하기 위한 Endpoints
는 chat
으로 설정한다. 이 경우 ws://localhost:8080/chat
으로 커넥션을 연결하고 메세지 통신을 할 수 있다.
모든 클라이언트의 브라우저에서 WebSocket을 지원한다는 보장이 없으므로 WebSocket Emulation을 이용하여 우선 WebSocket을 시도하고, 실패할 경우 HTTP Streaming, Long-Polling 같은 HTTP 기반의 다른 기술로 전환해 다시 연결을 시도하는 것을 말한다.
간단하게
.withSockJs()
한줄로 설정이 가능하다.
개발하는 고라니님의 블로그를 참고하였습니다.