Einfaches Beispiel mit Netty Socket.IO

fireGlurak

Aktives Mitglied
Hallo zusammen,

ich spiele gerade ein wenig mit der netty Socket.IO libary rum und habe dazu ein einfaches Beispiel erstellt.

Bin jetzt nun soweit, dass meine Spring Boot-Anwendung lauffähig ist und scheinbar der Socket.IO-server auch startet (zumindest wir mir das in den Logs so angezeigt <- 2023-12-29T02:13:48.824+01:00 INFO 27228 --- [ntLoopGroup-2-1] c.c.socketio.SocketIOServer : SocketIO server started at port: 8080)

Testweise versuche ich mich über den Broswser damit zu connecten, allerding scheint dies noch nicht wirklichzu klappen.

Hier erstmal der Code

Java:
import com.corundumstudio.socketio.SocketIOServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class demo implements CommandLineRunner {

    @Autowired
    private SocketIOServer socketIOServer;

    public static void main(String[] args) {
        SpringApplication.run(demo.class, args);
    }

    @Override
    public void run(String... args) {
        socketIOServer.start();
    }
}


Java:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.corundumstudio.socketio.SocketIOServer;

@Configuration
public class SocketIoConfig {

    @Bean
    public SocketIOServer socketIOServer() {
        com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration();
        config.setHostname("localhost");
        config.setPort(8080);
        return new SocketIOServer(config);
    }
}

Java:
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.listener.ConnectListener;
import org.springframework.stereotype.Component;

@Component
public class MyConnectListener implements ConnectListener {

    @Override
    public void onConnect(SocketIOClient client) {
        System.out.println("Client connected: " + client.getSessionId().toString());
    }
}

Wenn ich jetzt über den Browser aufrufe, dann ist meine Erwartungshaltung, dass onConnect getriggert wird und eine entsprechende Meldung geschrieben wird, aber das passiert leider nicht.

Was ich aber beim debuggen feststelle ist, dass das jedesein Thread erzeugt wird, wenn ich http://localhost:8080/ aufrufe.


debug.PNG

Also irgendwie scheint das schon anzukommen, aber wieso wird onConnect nicht aufgerufen.

Über Unterstützung wäre ich dankbar 🙂
 
Wieso sollte er denn onConnect aufrufen? Du setzt den ConnectionListener nicht. Wenn Du willst, dass der ConnectionListener aufgerufen wird, dann solltest Du den im Server auch setzen. Also etwas wie:

Java:
@Configuration
public class SocketIoConfig {
    
    @Autowired
    MyConnectionListener myConnectionListener;

    @Bean
    public SocketIOServer socketIOServer() {
        com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration();
        config.setHostname("localhost");
        config.setPort(8080);
        SocketIOServer server = new SocketIOServer(config);
        server.addConnectionListener(myConnectionListener);
        return server;
    }
}

Das ist jetzt so im Forum entstanden und kann daher Tippfehler enthalten und ist ungetestet.
 
Hallo Konrad,

guter Punkt. Habe das mal angepasst

Java:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.corundumstudio.socketio.SocketIOServer;



@Configuration
public class SocketIoConfig {
    

@Autowired
MyConnectListener myConnectListener;

    @Bean
    public SocketIOServer socketIOServer() {
        com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration();
        config.setHostname("localhost");
        config.setPort(8080);
        SocketIOServer server = new SocketIOServer(config);
        server.addConnectListener(myConnectListener);
        return  server;
    }

Führt aber leider immer noch dazu, dass onConnect nciht getriggert wird :-/ Hast du noch eine Idee?
 
Hast du mal ein Beispielprojekt zur Hand, damit man sich nicht alles selbst aufbauen muss? Einfach per GitHub oder so teilen oder zur Not als ZIP hier im Forum ... oder per email an konrad at neitzel.de.
 
Ich habe das Projekt mal als zip angehängt, da ich leider noch keine Git/GitHub integration bei meinem Projekt habe. Falls es irgendwelche Schwierigkeiten geben sollte, dann gerne mal bescheid geben. Dann sehe ich mal zu, dass ich das auf GitHub bekomme.

Vielen Dank schon mal für die Unterstützung 🙂
 

Anhänge

Also das Problem ist relativ einfach: Du hast da einen socket.io Server. Das ist kein universeller Server Socket für beliebige Verbindungen sondern ein Server, der ein spezielles Protokoll implementiert. Da muss ein entsprechender socket.io Client sich verbinden.

Introduction | Socket.IO
Although Socket.IO indeed uses WebSocket for transport when possible, it adds additional metadata to each packet.

Das OnConnect Event wird also erst kommen, nachdem der Client ein Handshake mit dem Server erfolgreich beendet hat und dann verbunden ist.

Ich habe mit Socket.IO aber noch nichts gemacht, daher kann ich da nicht wirklich mehr weiterhelfen.
 
Also das Problem ist relativ einfach: Du hast da einen socket.io Server. Das ist kein universeller Server Socket für beliebige Verbindungen sondern ein Server, der ein spezielles Protokoll implementiert. Da muss ein entsprechender socket.io Client sich verbinden.

Introduction | Socket.IO


Das OnConnect Event wird also erst kommen, nachdem der Client ein Handshake mit dem Server erfolgreich beendet hat und dann verbunden ist.

Ich habe mit Socket.IO aber noch nichts gemacht, daher kann ich da nicht wirklich mehr weiterhelfen.
Hallo Konrad,

danke für den Hinweis. Ich habe mal über meine React-Native-Anwendung etwas herumprobiert und versucht eine Verbindung aufzubauen, aber bisher hatte ich noch kein Glück. Wenn ich über NodeJs einen socket.io-Server starte, dann funktioniert das problemlos 😀

Naja ich werde mal weiter schauen...
 

Zurück
Oben