Inhaltsverzeichnis
Szenario
Hintergrund
POM-Abhängigkeit, Spring4.1.4.RELEASE, Spring Please Fügen Sie Kernabhängigkeiten selbst hinzu. Im Folgenden finden Sie WebSocket-bezogene Jars
Heim Web-Frontend H5-Tutorial Detaillierte Einführung in Spring WebSocket

Detaillierte Einführung in Spring WebSocket

Jul 03, 2017 pm 03:18 PM
spring web websocket

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>
Nach dem Login kopieren

@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();
    }
}
Nach dem Login kopieren
    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) {

    }
}
Nach dem Login kopieren
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;
    }
}
Nach dem Login kopieren

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关闭");
}
Nach dem Login kopieren
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!

Erklärung dieser Website
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

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was sind die Implementierungsmethoden für programmatische Frühlingstransaktionen? Was sind die Implementierungsmethoden für programmatische Frühlingstransaktionen? Jan 08, 2024 am 10:23 AM

Was sind die Implementierungsmethoden für programmatische Frühlingstransaktionen?

Ein neues Programmierparadigma, wenn Spring Boot auf OpenAI trifft Ein neues Programmierparadigma, wenn Spring Boot auf OpenAI trifft Feb 01, 2024 pm 09:18 PM

Ein neues Programmierparadigma, wenn Spring Boot auf OpenAI trifft

Verwenden Sie Spring Boot und Spring AI, um generative Anwendungen für künstliche Intelligenz zu erstellen Verwenden Sie Spring Boot und Spring AI, um generative Anwendungen für künstliche Intelligenz zu erstellen Apr 28, 2024 am 11:46 AM

Verwenden Sie Spring Boot und Spring AI, um generative Anwendungen für künstliche Intelligenz zu erstellen

SSE und WebSocket SSE und WebSocket Apr 17, 2024 pm 02:18 PM

SSE und WebSocket

So legen Sie die Transaktionsisolationsstufe im Frühjahr fest So legen Sie die Transaktionsisolationsstufe im Frühjahr fest Jan 26, 2024 pm 05:38 PM

So legen Sie die Transaktionsisolationsstufe im Frühjahr fest

Anwendung des JUnit-Unit-Test-Frameworks in Spring-Projekten Anwendung des JUnit-Unit-Test-Frameworks in Spring-Projekten Apr 18, 2024 pm 04:54 PM

Anwendung des JUnit-Unit-Test-Frameworks in Spring-Projekten

So aktivieren Sie den administrativen Zugriff über die Cockpit-Web-Benutzeroberfläche So aktivieren Sie den administrativen Zugriff über die Cockpit-Web-Benutzeroberfläche Mar 20, 2024 pm 06:56 PM

So aktivieren Sie den administrativen Zugriff über die Cockpit-Web-Benutzeroberfläche

Ist PHP Front-End oder Back-End in der Webentwicklung? Ist PHP Front-End oder Back-End in der Webentwicklung? Mar 24, 2024 pm 02:18 PM

Ist PHP Front-End oder Back-End in der Webentwicklung?

See all articles