웹소켓은 일반 소켓에 HTTP프로토콜(STOMP) 얹은 것!
특징
- 최초 접속이 일반 http request를 통해 handshaking과정을 통해 이루어진다는 점이다. ( 기존의 CORS나 인증 과정을 이어갈 수 있다. )
- 양방향 통신이 가능하다.
STOMP (Simple Text Oriented Messaging Protocol)은 메세징 전송을 효율적으로 하기 위해 탄생한 프로토콜
특징
STOMP는 Publish-Subscribe 매커니즘을 제공한다
Spring Boot ( Spring Web + Web Socket )
ChatHandler.java
@Component public class ChatHandler implements WebSocketHandler { private static List<WebSocketSession> list= new ArrayList<>(); @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { System.out.println("closed"); list.remove(session); } @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { list.add(session); System.out.println("connet"); } @Override public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { String payload=message.getPayload().toString(); System.out.println("chat:"+payload); //여기서 이걸 db에 저장하면 되겠다. for(WebSocketSession sess:list) sess.sendMessage(message); } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { } @Override public boolean supportsPartialMessages() { // TODO Auto-generated method stub return false; } }
webSocketCofiConfig.java
@Configuration @EnableWebSocket public class webSocketConfig implements WebSocketConfigurer { @Autowired WebSocketHandler webSocketHandler; @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(webSocketHandler, "/websocket") .setAllowedOrigins("*"); } }
결과
Websocket Connect 요청 및 메세지 전송!
Server측에서 Message를 받음!
Error: getaddrinfo ENOTFOUND http
원인 =>http prefix로 인해 post에서 host를 정확히 인식하지 못해 생기는 Error
해결 =>http prefix를 없앤 상태로 localhost:8080/websocket로 host주소를 바꿔 요청했다.