>  기사  >  웹 프론트엔드  >  Spring WebSocket에 대한 자세한 소개

Spring WebSocket에 대한 자세한 소개

零下一度
零下一度원래의
2017-07-03 15:18:281839검색

Scenario

Websocket은 Html5의 새로운 기능 중 하나입니다. 그 목적은 브라우저와 서버 간의 전이중 통신 방법을 설정하고, http 요청-응답으로 인한 과도한 리소스 소비를 해결하는 동시에 채팅, 주식 거래, 게임 및 기타 높은 실시간 성능이 필요한 산업과 같은 특수 시나리오 응용 프로그램에 대한 새로운 솔루션을 제공합니다.

Background

브라우저에서는 http를 통해서만 단방향 통신이 가능합니다. Comet은 어느 정도 양방향 통신을 시뮬레이션할 수 있지만 효율성이 낮고 서버의 소켓과 xmlsocket의 좋은 지원이 필요합니다. flash 실제 양방향 통신이 가능합니다. flex ajax 브리지를 통해 이 두 기능을 javascript에서 사용할 수 있습니다. 일단 웹소켓이 브라우저에 구현되면 위의 두 기술을 대체하고 널리 사용될 것으로 예상됩니다. 이러한 상황에 직면하여 HTML5는 서버 리소스와 대역폭을 더 잘 절약하고 실시간 통신을 달성할 수 있는 WebSocket 프로토콜을 정의합니다. 현재 모든 주요 주류 브라우저는 websocket을 지원합니다. IE browser는 IE10+

필요합니다. 1. POM 종속성

POM 종속성, spring4.1.4.RELEASE, 다음은 websocket 관련 jars

<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 메소드를 재정의합니다. 이는 웹소켓 입구, 허용된 액세스 도메인, 등록된 핸들러, SockJs 지원 및 인터셉터를 구성하는 핵심 구현 방법입니다.

  2. registry.addHandler에는 클라이언트가 웹소켓 연결을 시작할 때 특정 비즈니스 로직을 구현하지 않고 처리를 위해 해당 핸들러로 전달되는 /path가 수집 및 작업 분산 센터로 이해될 수 있습니다.

  3. setAllowedOrigins(String[] domains)는 지정된 도메인 이름 또는 IP(포트 번호 포함)가 긴 연결을 설정하도록 허용합니다. 자신의 도메인 이름에 대한 액세스만 허용하는 경우 여기에서 쉽게 설정할 수 있습니다. "*" 기호를 시간 제한 없이 사용할 경우 도메인 이름을 지정할 경우 http 또는 https로 시작해야 합니다.

  4. addInterceptors는 이름에서 알 수 있듯이 핸들러에 인터셉터를 추가하는 것입니다. 핸들러 호출 전후에 자체 논리 코드를 추가할 수 있습니다.

  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, 핸들러 호출 전 처리 방법. 핸들러에서 사용자 정보를 등록하고 WebSocketSession을 바인딩하고 사용자 정보를 기반으로 WebSocketSession을 얻어 메시지를 보내는 데 흔히 사용됩니다.

4. 핸들러 처리 클래스

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关闭");
}

ReconnectingWebSocket.js를 사용하며 브라우저 자체 웹소켓에 재연결, 연결 시간 초과, 재연결 간격 실패 등의 확장 기능을 추가합니다. 횟수 등
프로젝트 홈페이지:ReconnectingWebSocket

위 내용은 Spring WebSocket에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.