[Socket.io][Spring][Angular] Brak możliwości komunikacji przez namespace

0

Nie wiem czy to w sumie bardziej problem z Javy czy Javy w wersji script, no ale mam problem z połączeniem Angulara i Springa za pomocą Socket.io.

Po stronie backendu, mam tak zbudowany serwer

<dependency>
	<groupId>com.corundumstudio.socketio</groupId>
	<artifactId>netty-socketio</artifactId>
	<version>1.7.7</version>
</dependency>
@Configuration
public class SocketServerConfiguration {

    private com.corundumstudio.socketio.Configuration configuration() {
        final var config = new com.corundumstudio.socketio.Configuration();
        config.setHostname("localhost");
        config.setPort(9092);
        return config;
    }

    @Bean
    public SocketIOServer socketServer() {
        final var server = new SocketIOServer(configuration());
        server.start();
        return server;
    }
}

I jakiś @Component który z tego korzysta, na wstępie zaznaczę - event jest łapany i emitowany.

@Component
public class LobbyServerSocket implements ApplicationListener<LobbyUpdatedEvent> {
    public static final String NAMESPACE = "lobby";
    private final LobbyService lobbyService;
    private final SocketIOServer socketServer;

    public LobbyServerSocket(final SocketIOServer socketServer, final LobbyService lobbyService) {
        this.lobbyService = lobbyService;
        this.socketServer = socketServer;
        socketServer.addNamespace(NAMESPACE);
    }

    @Override
    public void onApplicationEvent(final LobbyUpdatedEvent event) {
        socketServer.getNamespace(NAMESPACE).getBroadcastOperations().sendEvent(event.getType().toString(), lobbyService.getRooms());
    }
}

No i po stronie Angulara, mam taki service, zakomentowane linijki to inne próby, które również nie działają.

import { Socket } from 'ngx-socket-io';

@Injectable({
  providedIn: 'root'
})
export class LobbyService extends Socket {

  constructor() {
    super({ url: 'http://localhost:9092/lobby', options: {} });
//  super({ url: 'http://localhost:9092', options: {path: '/lobby'} });
//  super({ url: 'http://localhost:9092', options: {path: 'lobby'} });
//  super({ url: 'http://localhost:9092', options: {namespace: '/lobby'} });
//  super({ url: 'http://localhost:9092', options: {namespace: 'lobby'} });
  }
}

No i component który z tego korzysta, w skrócie.

  ngOnInit(): void {
    this.lobbyService.on('lobby-updated', (event) => {
      console.log(event)
    });
  }

No i niestety nie dzieje się nic, to znaczy eventy są emitowane, ale frontend ich nie odbiera. I nie jestem pewien gdzie jest błąd, bo jeżeli zarówno po stronie serwisu Angularowego usunę `/lobby' z URLa jak i po stronie Springa zrobię

   @Override
    public void onApplicationEvent(final LobbyUpdatedEvent event) {
        socketServer.getBroadcastOperations().sendEvent(event.getType().toString(), lobbyService.getRooms());
    }

to jest ok, fronted odbiera emitowane eventy. Tyle, że chciałbym jednak z tych namespaceów skorzystać, nie mam jednak pojęcia co zrobić by to działało.

0

@AnyKtokolwiek: Co do Twojego komentarza

What Socket.IO is not
Socket.IO is NOT a WebSocket implementation. Although Socket.IO indeed uses WebSocket as a transport when possible, it adds additional metadata to each packet. That is why a WebSocket client will not be able to successfully connect to a Socket.IO server, and a Socket.IO client will not be able to connect to a plain WebSocket server either.

// WARNING: the client will NOT be able to connect!
const socket = io('ws://echo.websocket.org');

Poza tym, spędziłem trochę czasu na debugowaniu Javowej implementacji tego serwera i to co chcę zrobić jest chyba niemożliwe ;)
W skrócie,

 public void connect(ClientHead client) {
        Namespace ns = namespacesHub.get(Namespace.DEFAULT_NAME);
  // ...
 }

W żadnym miejscu nie jest wyciągany docelowy namespace. Wygląda więc na to, że pozostaje podłączyć się do głównego namespace i zaimplementować API które ręcznie przeniesie użytkownika do docelowego miejsca.

0

Nie znam tych protokołów, nie wiem co to w ich sensie "namespace", nie pomogę.

Zastanawia mnie coś innego, dlaczego nie łączysz Sproinga i Angulara "zwyczajnie", cokolwiek by to znaczyło.

0
AnyKtokolwiek napisał(a):

Nie znam tych protokołów, nie wiem co to w ich sensie "namespace", nie pomogę.

Zastanawia mnie coś innego, dlaczego nie łączysz Sproinga i Angulara "zwyczajnie", cokolwiek by to znaczyło.

Jeżeli przez zwyczajnie masz na myśli REST, to nie przejdzie, bo potrzebuje obustronnej komunikacji, piszę grę przeglądarkową tak więc serwer będzie na bieżąco notyfikował podłączonych klientów o stanie gry, itp.

Wiem, że mógłbym użyć zwykłych WebSocketów, ale Socket.io wydawał się szybszy w użyciu (nie mówie o wydajności, a o potrzebnym do napisania kodzie). Więc jak znalazłem Javową biblioteke do niego to postanowilem z tego skorzystać.

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