2014-11-26 23 views
28

WebSockets'ı SockJS client ve Spring 4 sunucusuyla kullanmanın bir yolu var mı, ancak STOMP kullanmıyor musunuz? Spring'in web sitesinden Bu eğitimde dayanarak Web Socketjs & Spring 4 ile birlikte Stomp olmadan

, ben istemci tarafında Stomp ve Bahar 4. kullanarak bir WebSocket tabanlı bir uygulamayı nasıl ayarlanacağını bilmek elimizde:
 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); 
      }); 
     }); 

Ve sunucu tarafında

, biz

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

Şimdi, @MessageMapping("/hello") bir mesaj bir hedefe "/hello" gönderilir, sonra greeting() yöntem adı verilecek olmasını sağlar anlıyoruz: denetleyici aşağıdaki var. Ve stompClient"/topic/greetings"'a abone olduğu için @SendTo("/topic/greetings"), iletiyi stompClient'a geri gönderir.

Ancak, yukarıdaki sorun, stompClient'in bir Stomp nesnesi olmasıdır. Ve sadece sock.send('test');'u kullanmak ve sunucumun hedefine teslim edilmesini istiyorum. Ve @SendTo("myownclientdestinationmap") yapmak istiyorum, ben Yani

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

bunu alabilir, Bahar 4, SockJS ile ve Stomp olmadan bunu yapmak için herhangi bir yolu? Veya Spring 4 WebSocket sadece Stomp'u destekliyor mu?

+0

"Spring-mvc" uygulamasında WebSocket kullanmak istiyorum, lütfen bana neden "STOMP" kullanmak istemediğinizi anlatabilir misiniz? –

cevap

46

Bahar WebSocket üzerinde STOMP destekler, ancak bir subprotocol kullanımı ham WebSocket'e başa çıkabilirim değil zorunluolduğunu. İşlenmemiş bir websocket kullanırken, mesaj, Spring mesajını belirli bir mesaj işleyici yöntemine (mesajlaşma protokolümüz yok) getirmek için bilgi eksikliğinden gönderildi. Bu nedenle, kontrol cihazınıza açıklama eklemek yerine, bir WebSocketHandler:

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); 
    } 
} 

sonra yapılandırmasında kayıt için işleyici ekleyin (birden fazla işleyici ekleyin ve yedek seçenekleri için SockJS kullanabilirsiniz):

@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(); 
    } 
} 

istemci tarafı böyle bir şey olacak:

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

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

Tam olarak aradığım şey bu. Teşekkür ederim! – BlueChips23

+1

merhaba @Sergi Almar, burada bir soru var, 4'ü kullanarak yeni WebSocket ('ws: // localhost: 8080/my-app/ws-connect-url') kullanarak web soketine bağlanmak mümkün; ? – Dev

+2

Elbette, sadece .withSockJS() öğesini kaldırın; yapılandırmadan ve düz JS WebSocket API'sini kullanın (herhangi bir geri dönüş seçeneğiniz olmaz) –