Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Einführung in Spring WebSocket

Detaillierte Einführung in Spring WebSocket

零下一度
零下一度Original
2017-07-03 15:18:281804Durchsuche

Szenario

Websocket ist eine der neuen Funktionen von Html5. Der Zweck besteht darin, eine Vollduplex-Kommunikationsmethode zwischen dem Browser und dem Server einzurichten, um den durch http-Anfragen verursachten übermäßigen Ressourcenverbrauch zu beheben -Antwort. Gleichzeitig bietet es neue Implementierungsmethoden für spezielle Szenarioanwendungen wie Chat, Aktienhandel, Spiele und andere Branchen, die eine hohe Echtzeitleistung erfordern.

Hintergrund

Über http im Browser kann nur eine einseitige Kommunikation erreicht werden, die jedoch weniger effizient ist Es ist eine gute Unterstützung für Socket und XMLSocket erforderlich. Durch Flex-Ajax-Bridge können diese beiden Funktionen in Javascript verwendet werden Sobald es im Browser implementiert ist, ersetzt es die beiden oben genannten Technologien und wird häufig verwendet. Angesichts dieser Situation definiert HTML5 das WebSocket-Protokoll, mit dem Serverressourcen und Bandbreite besser eingespart und eine Echtzeitkommunikation erreicht werden können. Derzeit unterstützen alle gängigen Mainstream-Browser den WebSocket

1. POM-Abhängigkeit

POM-Abhängigkeit, Spring4.1.4.RELEASE, Spring Please Fügen Sie Kernabhängigkeiten selbst hinzu. Im Folgenden finden Sie WebSocket-bezogene Jars

2. WebSocket-Eingang
<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>

@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();
    }
}
    Implementieren Sie die WebSocketConfigurer-Schnittstelle und überschreiben Sie die Methode registerWebSocketHandlers. Dies ist eine zentrale Implementierungsmethode, die Websocket-Eingänge, erlaubte Zugriffsdomänen, registrierte Handler, SockJs-Unterstützung und Interceptors konfiguriert.
  1. registry.addHandler-Registrierungs- und Routing-Funktion: Wenn der Client eine Websocket-Verbindung initiiert, wird /path zur Verarbeitung an den entsprechenden Handler übergeben, ohne dass eine spezifische Geschäftslogik implementiert werden muss, was verständlich ist als Sammel- und Aufgabenverteilungszentrum.
  2. setAllowedOrigins(String[] domains) ermöglicht dem angegebenen Domänennamen oder der angegebenen IP (einschließlich Portnummer), eine lange Verbindung herzustellen. Wenn Sie nur den Zugriff auf Ihren eigenen Domänennamen zulassen, ist dies möglich Stellen Sie es einfach hier ein. Bei Verwendung des „*“-Zeichens ohne zeitliche Begrenzung muss bei Angabe eines Domainnamens dieser mit http oder https beginnen.
  3. addInterceptors dient, wie der Name schon sagt, zum Hinzufügen von Interceptoren zum Handler. Wir können unseren eigenen Logikcode vor und nach dem Aufruf des Handlers hinzufügen.
  4. Spring Websocket unterstützt auch das STOMP-Protokoll, ich werde es das nächste Mal teilen.
  5. 3. Interceptor-Implementierung

beforeHandshake, Verarbeitungsmethode vor dem Aufruf des Handlers. Wird häufig verwendet, um Benutzerinformationen zu registrieren, WebSocketSession zu binden und WebSocketSession
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) {

    }
}
abzurufen, um Nachrichten

basierend auf Benutzerinformationen im Handler zu senden. 4. Handler-Verarbeitungsklasse

5. Client-Verbindung
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;
    }
}

ReconnectingWebSocket.js wird hier verwendet, um eine Erweiterung zum browsereigenen Websocket hinzuzufügen, z B. Wiederverbindung, Zeitüberschreitung der Verbindung, Intervall für fehlgeschlagene Wiederverbindung, maximale Anzahl von Verbindungsversuchen usw.
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关闭");
}
Projekthomepage:ReconnectingWebSocket

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in Spring WebSocket. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn