Einführung in WebSockets mit Spring

Einführung in WebSockets mit Spring

1. Überblick

In diesem Artikel erstellen wir eine einfache Webanwendung, die Messaging mithilfe der mit Spring Framework 4.0 eingeführtennew WebSocket capabilitiesimplementiert.

WebSockets ist einbi-directional,full-duplex,persistent connection zwischen einem Webbrowser und einem Server. Sobald eine WebSocket-Verbindung hergestellt wurde, bleibt die Verbindung geöffnet, bis der Client oder Server diese Verbindung schließt.

Ein typischer Anwendungsfall kann darin bestehen, dass in einer App mehrere Benutzer miteinander kommunizieren, z. B. in einem Chat. [#result_box]#We will build a simple chat client in our example. #

2. Maven-Abhängigkeiten

Da es sich um ein Maven-basiertes Projekt handelt, fügen wir zunächst die erforderlichen Abhängigkeiten zupom.xml hinzu:


    org.springframework
    spring-websocket
    4.2.4.RELEASE



    org.springframework
    spring-messaging
    4.2.4.RELEASE

Da wirJSON verwenden, um den Textkörper unserer Nachrichten zu erstellen, müssen wir außerdem dieJackson-Abhängigkeiten hinzufügen. Dadurch kann Spring unser Java-Objekt in / vonJSON konvertieren:


    com.fasterxml.jackson.core
    jackson-core
    2.7.3



    com.fasterxml.jackson.core
    jackson-databind
    2.7.3

Wenn Sie die neueste Version der oben genannten Bibliotheken erhalten möchten, suchen Sie sie inMaven Central.

3. Aktivieren Sie WebSocket im Frühjahr

Zunächst müssen Sie die WebSocket-Funktionen aktivieren. Dazu müssen wir unserer Anwendung eine Konfiguration hinzufügen und diese Klasse mit@EnableWebSocketMessageBroker versehen.

Wie der Name schon sagt, ermöglicht es die Verarbeitung von WebSocket-Nachrichten, die von einem Nachrichtenbroker unterstützt werden:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
         registry.addEndpoint("/chat");
         registry.addEndpoint("/chat").withSockJS();
    }
}

Here, we can see that Die MethodeconfigureMessageBroker wird fürconfigure the message broker verwendet. Zunächst aktivieren wir einen In-Memory-Nachrichtenbroker, der die Nachrichten an Zielen mit dem Präfix „/ topic“ zum Client zurückbringt.

Konfiguration von We complete our simpledurch Festlegen des Präfixes "/ app" zum Filtern von Zielen, die auf mit Anwendungen kommentierte Methoden abzielen (über@MessageMapping).

Die MethoderegisterStompEndpoints registriert den Endpunkt "/ chat" und aktiviertSpring’s STOMP support. Denken Sie daran, dass wir hier auch einen Endpunkt hinzufügen, der aus Gründen der Elastizität ohne SockJS funktioniert.

Wenn diesem Endpunkt das Präfix "/ app" vorangestellt wird, ist dies der Endpunkt, dem dieChatController.send()-Methode zugeordnet ist.

Es ist auchenables the SockJS fallback options,, so dass alternative Messaging-Optionen verwendet werden können, wenn WebSockets nicht verfügbar sind. Dies ist nützlich, da WebSocket noch nicht in allen Browsern unterstützt wird und möglicherweise von restriktiven Netzwerk-Proxys ausgeschlossen wird.

Durch die Fallbacks können die Anwendungen eine WebSocket-API verwenden, werden jedoch bei Bedarf zur Laufzeit ordnungsgemäß zu Alternativen ohne WebSocket degradiert.

4. Erstellen Sie das Nachrichtenmodell

Nachdem wir das Projekt eingerichtet und die WebSocket-Funktionen konfiguriert haben, müssen wir eine Nachricht zum Senden erstellen.

Der Endpunkt akzeptiert Nachrichten, die den Absendernamen und einen Text in einer STOMP-Nachricht enthalten, deren Hauptteil einJSON-Objekt ist.

Die Nachricht könnte folgendermaßen aussehen:

{
    "from": "John",
    "text": "Hello!"
}

Um die Nachricht mit dem Text zu modellieren, können wir einfache Eigenschaften für_ Java object with _from undtexterstellen:

public class Message {

    private String from;
    private String text;

    // getters and setters
}

Standardmäßig verwendet Spring die BibliothekJackson, um unser Modellobjekt in und von JSON zu konvertieren.

5. Erstellen Sie einen Controller für die Nachrichtenverarbeitung

Wie wir gesehen haben, besteht der Ansatz von Spring bei der Arbeit mit STOMP-Messaging darin, dem konfigurierten Endpunkt eine Controller-Methode zuzuordnen. Dies wird durch die Annotation@MessageMappingermöglicht.

Die Zuordnung zwischen dem Endpunkt und dem Controller gibt uns die Möglichkeit, die Nachricht bei Bedarf zu verarbeiten:

@MessageMapping("/chat")
@SendTo("/topic/messages")
public OutputMessage send(Message message) throws Exception {
    String time = new SimpleDateFormat("HH:mm").format(new Date());
    return new OutputMessage(message.getFrom(), message.getText(), time);
}

For the purposes of our example, we’ll create another model object named OutputMessage to represent the output message sent to the configured destination. Wir füllen unser Objekt mit dem Absender und dem Nachrichtentext aus der eingehenden Nachricht und bereichern es mit einem Zeitstempel.

Nachdem wir unsere Nachricht bearbeitet haben, senden wir sie an das entsprechende Ziel, das mit der Annotation@SendTodefiniert ist. Alle Teilnehmer am Ziel "/topic/messages" erhalten die Nachricht.

6. Erstellen Sie einen Browser-Client

Nachdem wir unsere Konfigurationen auf der Serverseite vorgenommen haben, verwenden wirsockjs-client library, um eine einfache HTML-Seite zu erstellen, die mit unserem Nachrichtensystem interagiert.

Zunächst müssen wir die Javascript-Clientbibliothekensockjs undstomp importieren. Als nächstes können wir eineconnect()-Funktion zum Öffnen der Kommunikation mit unserem Endpunkt, einesendMessage()-Funktion zum Senden unserer STOMP-Nachricht und einedisconnect()-Funktion zum Schließen der Kommunikation erstellen:


    
        Chat WebSocket
        
        
        
    
    
        


7. Beispiel testen

Um unser Beispiel zu testen, können wir einige Browserfenster öffnen und auf die Chat-Seite zugreifen:

http://localhost:8080/spring-mvc-java/resources/chat.html

Sobald dies erledigt ist, können wir dem Chat beitreten, indem wir einen Spitznamen eingeben und auf die Schaltfläche "Verbinden" klicken. Wenn wir eine Nachricht verfassen und senden, können wir sie in allen Browsersitzungen sehen, die dem Chat beigetreten sind.

[#result_box .short_text] # Sehen Sie sich den Screenshot an, um ein Beispiel zu sehen: #

screenshot

8. Fazit

In diesem Tutorial wirdwe’ve exploredpring's WebSocket-Unterstützung. Wir haben die serverseitige Konfiguration gesehen und ein einfaches clientseitigescounterpart unter Verwendung der Javascript-Bibliothekensockjs undstomp erstellt.

Der Beispielcode befindet sich inGitHub project.