2014-11-26 16 views
28

Có cách nào để sử dụng WebSockets với máy khách SockJS và máy chủ Spring 4 nhưng không sử dụng STOMP không?WebSocket với Sockjs & Spring 4 nhưng không có Stomp

Dựa trên hướng dẫn này từ trang web của Spring, tôi biết làm thế nào để thiết lập một ứng dụng dựa WebSocket sử dụng Stomp và mùa xuân 4. Về phía khách hàng, chúng ta có:

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

Và ở phía máy chủ, chúng tôi có sau trong bộ điều khiển:

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

Bây giờ, tôi hiểu rằng @MessageMapping("/hello") đảm bảo rằng nếu một thông điệp được gửi đến một điểm đến "/hello", sau đó phương pháp greeting() sẽ được gọi. Và kể từ khi số stompClient được đăng ký "/topic/greetings", @SendTo("/topic/greetings") sẽ gửi lại thư đến số stompClient.

Nhưng vấn đề ở trên là stompClient là đối tượng Stomp. Và tôi muốn chỉ đơn giản là sử dụng sock.send('test'); và nó đã được gửi đến đích của máy chủ của tôi. Và tôi muốn làm @SendTo("myownclientdestinationmap"), tôi có thể nhận được nó bằng cách

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

Vì vậy, bất kỳ cách nào để làm điều này với Spring 4, SockJS và không Stomp? Hoặc SpringS WebSocket chỉ hỗ trợ Stomp?

+0

Tôi muốn sử dụng WebSocket trong ứng dụng 'spring-mvc' của tôi, bạn có thể vui lòng hướng dẫn/cho tôi biết tại sao bạn không muốn sử dụng' STOMP'?, Cảm ơn bạn !!! –

Trả lời

46

Xuân hỗ trợ STOMP qua WebSocket nhưng việc sử dụng một subprotocol là không bắt buộc, bạn có thể đối phó với các WebSocket thô. Khi sử dụng websocket thô, thông báo sẽ gửi thiếu thông tin để Spring chuyển nó đến một phương thức xử lý tin nhắn cụ thể (chúng ta không có bất kỳ giao thức nhắn tin nào), thay vì chú thích bộ điều khiển, bạn sẽ phải thực hiện 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); 
    } 
} 

và sau đó thêm xử lý của bạn để đăng ký trong cấu hình (bạn có thể thêm nhiều hơn một handler và sử dụng SockJS cho các tùy chọn dự phòng):

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

phía client sẽ được cái gì như thế này:

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

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

Đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn bạn! – BlueChips23

+1

hello @Sergi Almar, tôi có một câu hỏi ở đây, sử dụng mùa xuân 4 là nó có thể kết nối với ổ cắm web bằng cách sử dụng 'WebSocket mới ('ws: // localhost: 8080/my-app/ws-connect-url');' ? – Dev

+2

Chắc chắn, chỉ cần xóa .withSockJS(); từ cấu hình và sử dụng JS WebSocket API đơn giản (bạn sẽ không có bất kỳ tùy chọn dự phòng nào) –

Các vấn đề liên quan