Webscokety dla wielu klientów - Spring Boot + Angular2

0

Cześć,
mam taki problem: chciałbym zaimplementować komunikacje server-klient przy pomocy websocket'ów.
Póki co udało mi się to zrobić w ten sposób że w jednym czasie tylko jeden klient dostaje wiadomość od serwera, a chciałbym żeby otrzymywali wszyscy zalogowani np. żeby każdy klient otrzymywał wiadomość ze swoim ID. Czy mógłby mi ktoś podpowiedzieć w jaki sposób to rozwiązać.

Moja implementacja:

Klient

export class NotificationBoxComponent {

    temp: string = ''";
    ws: $WebSocket;
    constructor() {
        this.ws = new $WebSocket("ws://localhost:8088/myWebSocket");
    }

    subscribe($event) {     
        this.ws = new $WebSocket("ws://localhost:8080/myWebSocket");
        this.ws.getDataStream().subscribe(
            res => {
                var mes = JSON.parse(res.data).value;               
                this.temp= mes;
            },
        );
    }

}

Konfiguracja Web Socket

@Configuration
@EnableWebSocket
@EnableScheduling
public class WebSocketConfig implements WebSocketConfigurer {

    @Autowired
    MyHandler myHandler;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myHandler, "/myWebSocket");
    }

}

Handler ktory wysyla wiaodmosc

@Component
public class MyHandler extends TextWebSocketHandler {

    WebSocketSession session;

    public void messageCallback(int count) {
        System.out.println("Trying to send:" + count);
        if (session != null && session.isOpen()) {
            try {
                 session.sendMessage(new TextMessage("my message "));
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("Don't have open session to send:" + counter);
        }
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession session) {
        this.session = session;
    }

Scheduler wywołujacy wysylanie

@Configuration
@EnableWebSocket
@EnableScheduling
public class WebSocketConfig implements WebSocketConfigurer {

    @Autowired
    MyHandler myHandler ;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myHandler , "/myWebSocket");
    }

}
0

Najlepiej nadaje się do tego STOMP + WebSocket i jego obsługa w Spring.

Przy wykorzystaniu tego połączenia wraz ze Springiem udało mi się napisać grę multiplayer.

Tutaj masz przyklady jak to działa (to jest fragment kodu tej gry, gdzie korzystam z "kontrolerów STOMP"):
https://github.com/Fantazjatyk/michal.szymanski.tictactoe.webclient/tree/master/main/java/pl/michal/szymanski/ticktacktoe/client/controllers.

Zauważ, że użytkowników identyfikuję poprzez zmienne w ścieżkach.

Po stronie klienta musisz korzystać z biblioteki STOMP.js.
Tutaj jest oficjalny tutorial: https://spring.io/guides/gs/messaging-stomp-websocket/

1
Fantazjatyk napisał(a):

Najlepiej nadaje się do tego STOMP + WebSocket i jego obsługa w Spring.

A ja polecę MQTT z powodu lepszego supportu bibliotek na wszystkich platformach. Pisałem pracę inżynierską Spring + STOMP, Android, WP. Nie było utrzymanej wersji bibliotek pod WP co kompletnie zatrzymało pracę. Z protokołu MQTT korzysta min. Facebook Messenger.

0

Chyba chodzi Ci o to z Tutoriala do Javy EE: 18.5.1.1 Sending Messages to All Peers Connected to an Endpoint. Czyli session.getOpenSessions().

1 użytkowników online, w tym zalogowanych: 0, gości: 1