spring WebSocket 예제 상세 정보

6242 단어 springWebSocket
장면
웹소켓은 Html5의 새로운 증가 특성 중 하나로 브라우저와 서비스 측이 쌍방향 통신 방식을 구축하여 http 요청-응답으로 인해 과도한 자원 소모를 해결하는 동시에 특수 장면 응용에 새로운 실현 방식을 제공했다. 예를 들어 채팅, 주식 거래, 게임 등 실시간성에 대한 요구가 비교적 높은 업계 분야이다.
배경
브라우저에서 http를 통해 단방향 통신만 실현할 수 있고comet은 어느 정도 양방향 통신을 모의할 수 있으나 효율이 낮고 서버가 비교적 좋은 지원을 필요로 한다.flash의 socket과 xmlsocket는 진정한 양방향 통신을 실현할 수 있으며, flex ajaxbridge를 통해javascript에서 이 두 가지 기능을 사용할 수 있습니다.웹소켓이 브라우저에서 실현되면 상기 두 가지 기술을 대체하여 광범위하게 사용될 것으로 예상된다.이러한 상황에 직면하여 HTML5는 웹 소켓 프로토콜을 정의하여 서버 자원과 대역폭을 더욱 절약하고 실시간 통신에 도달할 수 있도록 한다.현재 각 주요 브라우저는 웹소켓을 지원하고 있으며, IE 브라우저는 IE10+
1. POM 의존성
POM 의존, spring 4.1.4.RELEASE,spring 핵심 의존 자체 추가, 다음은 웹소켓 관련jar

<dependency>
  <groupId>javax.websocket</groupId>
  <artifactId>javax.websocket-api</artifactId>
  <version>1.0</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-websocket</artifactId>
  <version>4.1.4.RELEASE</version>
</dependency>
2. WebSocket 포털

@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
  @Override
  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    // , http https 
    String[] allowsOrigins = {"http://www.xxx.com"};
    
    //WebIM WebSocket 
    registry.addHandler(chatWebSocketHandler(),"/      webSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor());
    registry.addHandler(chatWebSocketHandler(), "/sockjs/w     ebSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor()).withSockJS();
  }
  @Bean
  public ChatWebSocketHandler chatWebSocketHandler() {
    return new ChatWebSocketHandler();
  }
  @Bean
  public WebSocketHandshakeInterceptor myInterceptor(){
    return new WebSocketHandshakeInterceptor();
  }
}
1. WebSocketConfigurer 인터페이스를 실현하고registerWebSocketHandlers 방법을 다시 쓴다. 이것은 핵심 실현 방법이다. 웹socket 입구를 설정하고 접근할 수 있는 영역, 등록 Handler, SockJs 지원과 차단기를 설정한다.
2.registry.ddHandler 등록과 루트의 기능은 클라이언트가 웹socket 연결을 시작하면/path를 대응하는 handler 처리에 맡기고 구체적인 업무 논리를 실현하지 않으면 수집과 임무 분배 센터로 이해할 수 있다.
3.setAllowed Origins(String[]domains), 지정한 도메인 이름이나 IP (포트 번호 포함) 의 긴 연결을 허용합니다. 만약 자신의 도메인 이름만 접근할 수 있다면 쉽게 설정할 수 있습니다."*"번호를 한정적으로 사용하지 않으면 도메인 이름을 지정하면 http 또는 https로 시작해야 합니다.
4.addInterceptors는 말 그대로 Handler에 차단기를 추가하는 것입니다. Handler를 호출하기 전에 우리의 논리 코드를 추가할 수 있습니다.
5.spring websocket도 STOMP 프로토콜을 지원하고 다음에 공유합니다.
3. 차단기 구현

public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {

  @Override
  public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object
        > attributes) throws Exception {
    if (request instanceof ServletServerHttpRequest) {
      attributes.put("username",userName);
    }
    return true;
  }

  @Override
  public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {

  }
}

beforeHandshake,handler를 호출하기 전에 처리 방법입니다.사용자 정보를 등록하고 WebSocketSession을 귀속시키며handler에서 사용자 정보에 따라 WebSocketSession을 가져와 메시지를 보냅니다.
4. Handler 처리 클래스

public class ChatWebSocketHandler extends TextWebSocketHandler{
  
  private final static List<WebSocketSession> sessions = Collections.synchronizedList(new ArrayList<WebSocketSession>());
  // , 
  @Override
  protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
    chatTextMessageHandler(message.getPayload());
    super.handleTextMessage(session, message);
  }
  // 
  @SuppressWarnings("unchecked")
  @Override
  public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    logger.debug("connect to the websocket chat success......");
    sessions.add(session);
    // 
  }
  // 
  @Override
  public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
    if(session.isOpen()){
      session.close();
    }
    logger.debug("websocket chat connection closed......");
    sessions.remove(session);
  }
  // 
  @Override
  public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
    logger.debug("websocket chat connection closed......");
    sessions.remove(session);
  }

  @Override
  public boolean supportsPartialMessages() {
    return false;
  }
}

5. 클라이언트 연결

var host = window.location.host;
var websocket;
if ('WebSocket' in window) {
  websocket = new ReconnectingWebSocket("ws://"
    + host + "/webSocketIMServer", null, {debug:true, maxReconnectAttempts:4});
} else if ('MozWebSocket' in window) {
  websocket = new MozWebSocket("ws://" + host
    + "/webSocketIMServer");
} else {
  websocket = new SockJS("http://" + host
      + "/sockjs/webSocketIMServer");
}
websocket.onopen = function(evnt) {
  console.log("websocket ");
};
websocket.onmessage = function(evnt) {
  messageHandler(evnt.data);
};
websocket.onerror = function(evnt) {
  console.log("websocket ");
};
websocket.onclose = function(evnt) {
  console.log("websocket ");
}
여기에는 Reconnecting WebSocket이 사용됩니다.js, 브라우저 자체 웹소켓에 확장을 추가했습니다. 예를 들어 재연결, 연결 시간 초과, 실패 재연결 간격, 연결 시도 최대 횟수 등입니다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기