study

WebSocket

hjkeeeem 2024. 9. 3. 01:47

Websocket

- 주로 채팅

- 연결 종료시 까지 양방향 통신

- 클라이언트와 서버간의 TCP 연결을 길게 유지하고, 서로 양방향으로 데이터를 전달하게 해주는 통신 규약의 일종

- 연결이 끊어졌을 때 다시 붙이는 작업이 필요함

 

sse

- 주로 알람

upgrade 하자 (웹소켓) 라고 하는 요청을 handshake 요청이라고 한다.

 

 

Spring

 

TextWebSocketHandler 상속받아서 사용

- 데이터형태는 byte 형태

 

@Slf4j
@Component
public class SimpleChatHandler extends TextWebSocketHandler {
    // 현재 연결되어 있는 클라이언트를 관리하기 위한 리스트
    private final List<WebSocketSession> sessions = new ArrayList<>();

    @Override
    // webSocket 최초 연결 시 실행
    public void afterConnectionEstablished(
            // 연결 되어있는 브라우저 하나당 연결 상태를 표현하기 위해
            // 연결된 클라이언트(사용자)를 나타내는 객체
            // 누구한테 보낼지에 대한 정보가 담겨있음
            WebSocketSession session
    )throws Exception{
        // 방금 참여한 사용자 저장
        sessions.add(session);
        log.info("connected with session id: {}, total sessions : {}", session.getId(), sessions.size());
    }


    @Override
    // WebSocket 메세지를 받으면 실행
    protected void handleTextMessage(
            WebSocketSession session,
            TextMessage message
    )throws Exception{
        // 사용자가 보낸 메세지를 받는 부분
        // TextMessage로 사용자가 보낸 메세지를 받아와 payload라는 문자열 변수애 getPayload();
        String payload = message.getPayload();
        log.info("received: {}", payload);
        super.handleTextMessage(session, message);
    }

    @Override
    // WebSocket 연결이 종료되었을때
    public void afterConnectionClosed(
            WebSocketSession session,
            CloseStatus status) throws Exception {
        log.info("connection with {} closed", session.getId());
        // 더이상 세션 객체를 보유하지 않도록
        sessions.remove(session);
        super.afterConnectionClosed(session, status);
    }
}
package com.example.chat.config;

import com.example.chat.SimpleChatHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
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 WebSocketConfig implements WebSocketConfigurer {
    // TODO Bean 객체로 SimpleChatHandler 가져오기
    // 생성자를 이용해 가져오기
    private final SimpleChatHandler simpleChatHandler;
    public WebSocketConfig(
            SimpleChatHandler simpleChatHandler
    ){
        this.simpleChatHandler = simpleChatHandler;
    }


    @Override
    // WebSocketHandler 객체를 등록하기 위한 메소드
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(simpleChatHandler, "ws/chat").setAllowedOrigins("*");
    }
}

config 까지 작성 후 실행 > localhost:8080/chat/rooms > 이름 입력 > 메세지 입력 > 콘솔 확인

메세지를 받는 것 까지 구현 완료

'study' 카테고리의 다른 글

[AWS RDS] RDS 생성 및 연결 ( +보안그룹 변경 )  (1) 2024.09.03
[Docker] MySQL설치 및 intellij에서 접속하기  (1) 2024.09.03
(230627) AOP  (0) 2024.09.03
(230626) Validation  (0) 2024.09.03
(230623) [Postman] MultipartFile  (0) 2024.09.03