UDP는 비신뢰성(최소한의 오류 검사만 함) 전송 프로토콜이며, 비 연결형 서비스이다.
TCP는 신뢰성(오류 검사는 물론, 혼잡 제어, 흐름 제어도 수행) 있는 전송 프로토콜이며, 연결형 서비스이다.
여기서 알 수 있는 것은 뭐든 검사가 많을 수록 속도가 느리다는 것이다. (즉 UDP가 속도가 더 빠르다.)
-> 다시 주제로 넘어오면,
소켓은 3가지 요소로 정의가 된다.
1. Client가 서버에 요청(Request)을 보낸다.
2. 서버는 Socket 객체를 생성하고, Client에서 전송한 데이터(메시지)를 입력 스트림(파일 데이터를 읽거나 네트워크 소켓을 통해 데이터를 읽거나 키보드에서 입력한 데이터를 읽을 때 사용)을 통해 읽어온다.
webSocket.current = new WebSocket("ws://localhost:8080/소켓주소");
// 클라이언트 소켓이 서버 소켓에 접속했을 때 이벤트
webSocket.current.onopen = ()=>{
console.log("웹 소켓 접속했습니다.");
}
package ezenweb.web.socket;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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 // 컴포넌트 등록 [주요 : Service , Controllerm Repository 등등]
@Slf4j
@EnableWebSocket // * 웹 소켓 연결 WSA 프로토콜, WS 프로토콜의 URL 매핑 연결
public class WebSocketConfiguration implements WebSocketConfigurer { //implments : 구현 하다
@Autowired //컴포넌트에 등록한 클래스 이므로 @Autowired 가능
private ChattingHandler chattingHandler; //의존성 주입(DI)
@Override //서버 소켓으로 사용되고 있는 클래스를 등록(프론트 주소(라우터)와 겹치면 절대 안됨!!!!!)
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
//chatHandler를 chat이라는 주소로 매핑하며, 들어올 수 있는 도메인은 모두("*")이다.
registry.addHandler(chattingHandler, "/chat").setAllowedOrigins("*");
//registry.addHandler(서버소켓 객체, "서버소켓의 path/url").setAllowedOrigins("*"); : 서버소켓 등록 함수
//.setAllowedOrigins("접속허용 도메인") : 해당 서버소멧으로 부터 요청할 수 있는 URL/도메인
//.setAllowedOrigins("*") : 해당 서버소멧으로 부터 요청할 수 있는 URL/도메인
//서버 소켓이 더 있으면 의존성 주입 객체를 만들고 위처럼 해당 객체로 더 추가하면된다.
}
}
//** 서버소켓에 접속한 명단 저장 WebSocketSession : 스프링꺼 사용
private static List<WebSocketSession> connectionList = new ArrayList<>(); //접속 명단
//클라이언트가 서버소켓으로 접속했을 때
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
log.info("afterConnectionEstablished : " + session);
connectionList.add(session); //클라이언트 세션에 들어왔을 때 리스트에 추가[다른 세션들과 통신하기 위해]
}
webSocket.current.onmessage = (e)=>{
console.log("웹 소켓 메시지왔습니다.");
let data = JSON.parse(e.data); //서버로부터 받은 메시지 형변환 JSON 형식으로 변환(웹에서 읽기 위해 => 화면에 출력하기 위해)
}
//클라이언트로 부터 메시지 받았을 때
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
log.info("handleTextMessage : " + session);
for(WebSocketSession conn : connectionList) {
conn.sendMessage(message); //메시지 보냄
}
}
//서버소켓 나갔을 때
webSocket.current.onclose = (e)=>{console.log("웹 소켓 나갑니다.");}
//서버소켓과 오류가 발생했을 때
webSocket.current.onerror = (e)=>{console.log("웹 소켓 에러 발생했습니다.");}
// 클라이언트가 서버 소켓으로 부터 나갔을 때
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
log.info("afterConnectionClosed : " + session);
connectionList.remove(session); //클라이언트 세션이 나갔을 때 리스트 제거
}
}