글 목차
728x90
(목차) https://okane-on-cliff.tistory.com/257
1. 디렉터리 구조
눈 여겨 볼것은
1. SocketHandler
2. SocketConfigurer
3. ssafykey.p12, application.properties
4. pom.xml
이다.
2. pom.xml
그냥 의존성으로 (1) 스프링 웹, (2) 데브 툴, (3) 웹소켓 추가하면 된다.
3. ssafykey.p12, application.properties
이건 배포때 설명할 예정
4. SocketConfigurer
package rtc;
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;
@Configuration
@EnableWebSocket
public class SocketConfigurer implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new SocketHandler(), "/socket").setAllowedOrigins("*");
}
}
@Configuration이 달려 있는 스프링 설정클래스다.
@EnableWebSocket을 통해 웹소켓을 사용한다는 것을 알려준다.
/socket은 context-path 뒤에 붙어서 소켓연결을 위한 url이 된다. 후에 자바스크립트에서 이를 호출하여 소켓연결을 한다.
SocketHandler 객체를 생성하여 Bean으로 등록하는 것 같다. 이건 확실하지 않다. 설정파일내에서 @Bean을 통해 컴포넌트를 만드는것과 비슷한 양상인것 같아 추측하는것 뿐이다.
5. SocketHandler
package rtc;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
@Component
public class SocketHandler extends TextWebSocketHandler {
List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
for (WebSocketSession webSocketSession : sessions) {
if (webSocketSession.isOpen() && !session.getId().equals(webSocketSession.getId())) {
webSocketSession.sendMessage(message);
}
}
}
}
만들어진 Bean이 어떻게 동작하는지 TextWebSocketHandler를 이용해 재정의 했다.
세션 연결이 있을 때 마다 리스트에 웹소켓 세션들을 저장하고
메세지가 올때마다 열려있는 세션에 메세지를 전달하는 동작을 정의했다.
6. 정리
시그널링 서버는 소켓핸들러 인스턴스를 하나 가지고 있다. 클라이언트들은 이 소켓핸들러와 통신하며 세션을 등록하고 다른 세션들과 소켓통신을 한다. 이게 다다.
728x90