자세한 설명: 여기
//설정
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new SocketTextHandler(), "/user")
.setAllowedOrigins("*")
.withSockJS();
}
}
//핸들러
public class SocketTextHandler extends TextWebSocketHandler {
private final Set<WebSocketSession> sessions = ConcurrentHashMap.newKeySet();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String payload = message.getPayload();
JSONObject jsonObject = new JSONObject(payload);
for (WebSocketSession s : sessions) {
s.sendMessage(new TextMessage("Hi " + jsonObject.getString("user") + "!"));
}
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessions.remove(session);
}
}
WebSocket과 유사한 객체를 제공하는 라이브러리들
SockJS는 브라우저와 웹 서버 사이에 대기 시간이 짧은 전이중 도메인 간 통신 채널을 생성하는 일관된 브라우저 간 Javascript API를 제공
SockJS는 WebSocket 프로토콜을 지원하지 않는 환경에서도 작동
Socket.io는 node.js기반의 웹소켓 라이브러리
SockJS는 STOMP라고 하는 메세지 프로토콜과 함께 사용
Streaming Text Oriented Messaging Protocol
WebSocket 위에서 동작하는 간단한 텍스트기반 메시지 프로토콜
전송할 메시지의 유형, 형식, 내용들을 정의
메시지 브로커라는 것을 활용, pub-sub(발행-구독) 방식으로 클라이언트와 서버가 쉽게 메시지를 주고받을 수 있도록하는 하위 프로토콜
COMMAND
header1:value1
header2:value2
Body^@
--------------------------------------------
//요청 전송의 예
SEND
destination:/queue/trade
content-type:application/json
content-length:44
{"action":"BUY","ticker":"MMM","shares",44}^@
--------------------------------------------
//클라이언트 구독의 예
SUBSCRIBE
id:sub-1
destination:/topic/price.stock.*
^@
--------------------------------------------
//MESSAGE 명령의 예
MESSAGE
message-id:nxahklf6-1
subscription:sub-1
destination:/topic/price.stock.MMM
{"ticker":"MMM","price":129.45}^@
--------------------------------------------
STOMP 프로토콜은 웹소켓만을 위해 만들어진 프로토콜이 아니다.
그러면 왜 WebSocket 위에서 같이 사용하는 것일까?
https://faith-developer.tistory.com/194
https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte3.5:ptl:stomp
자세한 설명: 여기
// 설정
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketBrokerConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/queue","/topic");
registry.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws-edit")
.withSockJS();
}
}
// 컨트롤러 부분
@MessageMapping("/hello")
@SendTo("/topic/greeting")
public void enterChatRoom(SimpMessageHeaderAccessor headerAccessor) throws Exception {
ChatDto newchatdto = chatService.enterChatRoom(chatDto, headerAccessor);
msgOperation.convertAndSend("/sub/chat/room" + chatDto.getRoomId(), newchatdto);
}
https://velog.io/@pbg0205/Socket%EC%86%8C%EC%BC%93
https://doozi0316.tistory.com/entry/HTTPHTTPS%EB%9E%80-TCP-UDP-HandShake-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC
https://kellis.tistory.com/65
https://velog.io/@msung99/%EC%9B%B9%EC%86%8C%EC%BC%93%EA%B3%BC-STOMP%EB%A5%BC-%ED%86%B5%ED%95%9C-%EC%8B%A4%EC%8B%9C%EA%B0%84-%ED%86%B5%EC%8B%A0-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0