2014-11-26 7 views
28

Gibt es eine Möglichkeit, WebSockets mit SockJS-Client und Spring 4-Server zu verwenden, aber nicht mit STOMP?WebSocket mit Sockjs & Spring 4 aber ohne Stomp

Basierend auf diesem Tutorial von Spring-Website, ich weiß, wie 4. Auf der Client-Seite eine WebSocket-basierte Anwendung mit Stomp und Spring einzurichten, haben wir:

 var socket = new SockJS('/hello'); 
     stompClient = Stomp.over(socket); 
     stompClient.connect({}, function(frame) { 
      setConnected(true); 
      console.log('Connected: ' + frame); 
      stompClient.subscribe('/topic/greetings', function(greeting){ 
       showGreeting(JSON.parse(greeting.body).content); 
      }); 
     }); 

Und auf der Serverseite, wir folgendes haben in der Steuerung:

@MessageMapping("/hello") 
@SendTo("/topic/greetings") 
public Greeting greeting(HelloMessage message) throws Exception { 
    Thread.sleep(3000); // simulated delay 
    return new Greeting("Hello, " + message.getName() + "!"); 
} 

Jetzt verstehe ich, dass @MessageMapping("/hello") stellt sicher, dass, wenn eine Nachricht an ein "/hello" Ziel gesendet wird, dann ist die greeting() Methode aufgerufen wird. Und da die stompClient"/topic/greetings" abonniert ist, sendet die @SendTo("/topic/greetings") die Nachricht zurück an die stompClient.

Aber das Problem mit dem oben genannten ist, dass StompClient ein Stomp-Objekt ist. Und ich möchte einfach sock.send('test'); verwenden und es zum Ziel meines Servers liefern lassen. Und ich will @SendTo("myownclientdestinationmap") tun, kann ich es erhalten durch

sock.onmessage = function(e) { 
    console.log('message', e.data); 
}; 

also eine Möglichkeit, dies zu tun, mit Spring 4, SockJS und ohne Stomp? Oder unterstützt Spring 4 WebSocket nur Stomp?

+0

Ich möchte WebSocket in meiner 'spring-mvc' Anwendung verwenden. Könnten Sie mir bitte sagen, warum Sie' STOMP' nicht verwenden möchten? Danke !!! –

Antwort

46

Frühling unterstützt STOMP über WebSocket aber die Verwendung eines Subprotokoll ist nicht zwingend, können Sie mit dem rohen websocket beschäftigen. Bei der Verwendung eines unformatierten Websockets fehlt der gesendeten Nachricht eine Information, damit Spring sie an eine bestimmte Nachrichtenhandlermethode weiterleitet (wir haben kein Nachrichtenprotokoll). Daher müssen Sie, anstatt Ihren Controller zu kommentieren, eine WebSocketHandler implementieren:

public class GreetingHandler extends TextWebSocketHandler { 

    @Override 
    public void handleTextMessage(WebSocketSession session, TextMessage message) { 
     Thread.sleep(3000); // simulated delay 
     TextMessage msg = new TextMessage("Hello, " + message.getPayload() + "!"); 
     session.sendMessage(msg); 
    } 
} 

und dann Handler in der Registrierung in der Konfiguration hinzufügen (Sie können mehr als ein Handler hinzufügen und SockJS für Ersatzoptionen verwenden):

@Configuration 
@EnableWebSocket 
public class WebSocketConfig implements WebSocketConfigurer { 

    @Override 
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 
     registry.addHandler(greetingHandler(), "/greeting").withSockJS(); 
    } 

    @Bean 
    public WebSocketHandler greetingHandler() { 
     return new GreetingHandler(); 
    } 
} 

die Client-Seite so etwas wie dies sein wird:

var sock = new SockJS('http://localhost:8080/greeting'); 

sock.onmessage = function(e) { 
    console.log('message', e.data); 
} 
+1

Genau das habe ich gesucht. Vielen Dank! – BlueChips23

+1

Hallo @Sergi Almar, ich habe eine Frage hier, mit Feder 4 ist es möglich, eine Verbindung zum Web-Socket mit 'neuen WebSocket ('ws: // localhost: 8080/my-app/ws-Connect-URL');' ? – Dev

+2

Sicher, entfernen Sie einfach die .withSockJS(); aus der Konfiguration und verwenden Sie die plain JS WebSocket API (Sie werden keine Fallback-Optionen haben) –