Server - Client Nachrichtenaustausch über Eventbus

Adriano10

Bekanntes Mitglied
Wenn Client postet, kommt auf den Server leider nicht. Was mache ich hier falsch?

Java:
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
    private ServerSocket serverSocket;
    private Personal person;
    private EventBus eventBus;

    public Server(ServerSocket serverSocket) {
        this.serverSocket = serverSocket;
        this.eventBus = new EventBus();
        this.eventBus.register(this);
    }

    public void serverStarted() {
        try {
            Socket socket = serverSocket.accept();
            System.out.println("New Client has connected");

            if (socket.isConnected()) {
                System.out.println("Connected....");
            }
 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Subscribe
    public void print(Personal p) {
        this.person = p;

    }


    public String toString() {
        return this.person.getName();
    }

    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(4444);
            Server server = new Server(serverSocket);
            server.serverStarted();
            System.out.println(server.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

public class Client {
    private EventBus bus;
    public static Personal person;

    public Client(Socket socket) {
        try {
            this.bus = new EventBus();
            this.bus.register(this);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void sendMessage(Personal personal) {
        bus.post(personal);
    }

    public static void main(String[] main) {
        try {
            Socket socket = new Socket("Localhost", 4444);
            Client client = new Client(socket);
            client.sendMessage(new Personal("Test", 19, "Student"));
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 
Zuletzt bearbeitet:
Also bei Hostnamen sollte die Gross-/Kleinschreibung auch uninteressant sein. Aber warum müssen wir hier raten? Wieso gibt es keine konkreten Aussagen, was genau passiert?

Aber die Logik stimmt überhaupt nicht. Der EventBus dient der Kommunikation zwischen Komponenten einer Applikation. Nicht um zwischen zwei Applikationen zu kommunizieren.

Du hast einen Server, der einen EventBus hat. Und der Client hat auch einen EventBus (der aber natürlich nichts mit dem EventBus des Servers zu tun hat.)

Dein Client verbindet sich zwar auch mit dem Server (Ich vermute, dass Du die Ausgaben, die Du da teilweise machst, bekommst. Aber da es keine vernünftige Beschreibung gibt und ich keine Lust habe, das alles nachzustellen ist das nur eine Vermutung!) aber mit der Verbindung machst Du nichts.

Wie die Nutzung eines EventBusses aussehen könnte in z.B. einem Chat Server zeigt http://insightfullogic.com/2011/Oct/10/eventbus/

Da hast Du halt einen Server, der in einem Thread auf Clients hört. Jeder Client bekommt einen eigenen Thread, der beim EventBus registriert wird. Wenn dann etwas vom Client kommt, dann wird es an den EventBus gegeben. Und alles, was vom EventBus kommt, wird an die Sockets des Clients gegeben.

Eventbus verbindet also in einer Applikation die Komponenten, ohne dass diese Komponenten sich kennen müssen.
 
Hallo

Ich glaube das ist wider das altbekannte Problem von Anfängern die nicht verstehen. Das Server und Clint zwei getrennte Programme sind die auch auf unterschiedlichen Rechnen laufen könnten.

Das es zwei Programme sind siehst du ja schon daran das du zwei “main“ Methoden sind.

Jede Klasse ist für sich die eine weis von der anderen nichts.

Wenn du das auf einen Rechner simulierst laufen beide Programme in unterschiedlichen Betriebssystem Tasks. Kennen sich nicht. Nur das Netzerk ist die Verbindung.
 
Also bei Hostnamen sollte die Gross-/Kleinschreibung auch uninteressant sein. Aber warum müssen wir hier raten? Wieso gibt es keine konkreten Aussagen, was genau passiert?

Aber die Logik stimmt überhaupt nicht. Der EventBus dient der Kommunikation zwischen Komponenten einer Applikation. Nicht um zwischen zwei Applikationen zu kommunizieren.

Du hast einen Server, der einen EventBus hat. Und der Client hat auch einen EventBus (der aber natürlich nichts mit dem EventBus des Servers zu tun hat.)

Dein Client verbindet sich zwar auch mit dem Server (Ich vermute, dass Du die Ausgaben, die Du da teilweise machst, bekommst. Aber da es keine vernünftige Beschreibung gibt und ich keine Lust habe, das alles nachzustellen ist das nur eine Vermutung!) aber mit der Verbindung machst Du nichts.

Wie die Nutzung eines EventBusses aussehen könnte in z.B. einem Chat Server zeigt http://insightfullogic.com/2011/Oct/10/eventbus/

Da hast Du halt einen Server, der in einem Thread auf Clients hört. Jeder Client bekommt einen eigenen Thread, der beim EventBus registriert wird. Wenn dann etwas vom Client kommt, dann wird es an den EventBus gegeben. Und alles, was vom EventBus kommt, wird an die Sockets des Clients gegeben.

Eventbus verbindet also in einer Applikation die Komponenten, ohne dass diese Komponenten sich kennen müssen.
Danke für die Rückmeldung..

Ich wollte folgendes machen. Beim Anmelden wird die Benutzerdaten zum Server geschickt. Auf dem Server wird die Daten geprüft und bekommt der Client dann die Antwort.

Wenn die Daten korrekt sind, ist er angemeldet sonst nicht…

Ich möchte dieses Nachrichtenaustausch über EventBus durchführen. google.common.Eventbus hat bei mir Interesse erweckt und möchte bisschen Erfahrung machen.

Ich gucke mir auch den Link, den Sie gepostet haben.

Vielen Dank noch Mal
 
Du schickst nicht über das Netzwerk dein Cleint Socket was du erstellt hast benutzt du garnicht.
Du hast ja nicht mal einen In oder Output Stream.
Ich möchte dieses Nachrichtenaustausch über EventBus durchführen. google.common.Eventbus hat bei mir Interesse erweckt und möchte bisschen Erfahrung machen.

die Kommunikation muss ja über das Netzwerk laufen also braucht der Event Bus zumindest das Socket. Der dann auch die Streams benutzt.
 
Du schickst nicht über das Netzwerk dein Cleint Socket was du erstellt hast benutzt du garnicht.
Du hast ja nicht mal einen In oder Output Stream.


die Kommunikation muss ja über das Netzwerk laufen also braucht der Event Bus zumindest das Socket. Der dann auch die Streams benutzt.
Danke, ich dachte so was brauchte ich wegen EventBus nicht. Ich war davon ausgegangen, wenn Client und Server miteinander verbunden sind, dann die über eventBus gesendete Nachricht, gelangte den Server an. Also durch die Annotation @Subscribe könnte auf dem Server die Nachricht abgefangen werden
 
Dafür müssten EventBus auf dem Client und Server miteinander verbunden sein. Warum sollten sie das sein? Du erzeugst einen EventBus im Client und einen im Server. Das sind zwei komplett getrennte Objekte.

Um darüber auszutauschen, müsstest du sie miteinander verbinden über eine Netzwerk-Verbindung. Und wenn man mal die Beschreibung zu Eventbus liest:

It is not a general-purpose publish-subscribe system, nor is it intended for interprocess communication.

Genau dafür, wofür du es einsetzen willst, ist es explizit nicht gedacht.
 
Der EventBus in Guava ist erst einmal nur ein Tool, um in einer Applikation Komponenten voneinander zu trennen. Also ganz wichtig:
  • 1 Applikation!
  • mehrere Komponenten in der Applikation, die sich nicht kennen sollen.

Das ist also sowas wie: Du hast einen Monolithen aber intern hast Du mehrere Komponenten, die schon einmal getrennt sind.

Das gibt es natürlich auch noch in größer. Das nennt sich dann Enterprise Service Bus. Da gibt es auch mehrere Libraries / Lösungen zu. Da hast Du unter dem Stricht auch wieder den Aufbau wie vorher nur jetzt läuft es nicht mehr in einer Applikation, sondern mehrere Applikationen kommunizieren und das auch über das Netz,

Eine mögliche Library ist dann z.B. von Apache: https://servicemix.apache.org/
Und wenn Du Dir die Seite ansiehst, dann wird auch schnell klar, was da dann direkt für eine Komplexität entstanden ist intern:
  • Message Queuing kommt da rein - hier mit ActiveMQ
  • Apache Camel kommt rein für diverse Dinge um die Steuerung intern zu beeinflussen (um es mal ganz grob zu beschreiben - Link folgen und ansehen!)
  • Persistency ist wichtig - JPA kommt da ins Spiel
  • Ggf. willst Du Transaktionen haben? Distributed Transactions (XA Transactions) sind doch was feines ... Das, was die Entwickler bei Microservices scheuen wie der Teufel das Weihwasser will doch kein Masochist Links liegen lassen 🙂

Das wäre also evtl. das, was Dich interessieren könnte. Neben Apache gibt es da natürlich auch noch andere Libraries, die sowas machen....
 
Der EventBus in Guava ist erst einmal nur ein Tool, um in einer Applikation Komponenten voneinander zu trennen. Also ganz wichtig:
  • 1 Applikation!
  • mehrere Komponenten in der Applikation, die sich nicht kennen sollen.

Das ist also sowas wie: Du hast einen Monolithen aber intern hast Du mehrere Komponenten, die schon einmal getrennt sind.

Das gibt es natürlich auch noch in größer. Das nennt sich dann Enterprise Service Bus. Da gibt es auch mehrere Libraries / Lösungen zu. Da hast Du unter dem Stricht auch wieder den Aufbau wie vorher nur jetzt läuft es nicht mehr in einer Applikation, sondern mehrere Applikationen kommunizieren und das auch über das Netz,

Eine mögliche Library ist dann z.B. von Apache: https://servicemix.apache.org/
Und wenn Du Dir die Seite ansiehst, dann wird auch schnell klar, was da dann direkt für eine Komplexität entstanden ist intern:
  • Message Queuing kommt da rein - hier mit ActiveMQ
  • Apache Camel kommt rein für diverse Dinge um die Steuerung intern zu beeinflussen (um es mal ganz grob zu beschreiben - Link folgen und ansehen!)
  • Persistency ist wichtig - JPA kommt da ins Spiel
  • Ggf. willst Du Transaktionen haben? Distributed Transactions (XA Transactions) sind doch was feines ... Das, was die Entwickler bei Microservices scheuen wie der Teufel das Weihwasser will doch kein Masochist Links liegen lassen 🙂

Das wäre also evtl. das, was Dich interessieren könnte. Neben Apache gibt es da natürlich auch noch andere Libraries, die sowas machen....
Vielen Dank, das interessiert mich natürlich..
 
Der EventBus in Guava ist erst einmal nur ein Tool, um in einer Applikation Komponenten voneinander zu trennen. Also ganz wichtig:
  • 1 Applikation!
  • mehrere Komponenten in der Applikation, die sich nicht kennen sollen.

Das ist also sowas wie: Du hast einen Monolithen aber intern hast Du mehrere Komponenten, die schon einmal getrennt sind.

Das gibt es natürlich auch noch in größer. Das nennt sich dann Enterprise Service Bus. Da gibt es auch mehrere Libraries / Lösungen zu. Da hast Du unter dem Stricht auch wieder den Aufbau wie vorher nur jetzt läuft es nicht mehr in einer Applikation, sondern mehrere Applikationen kommunizieren und das auch über das Netz,

Eine mögliche Library ist dann z.B. von Apache: https://servicemix.apache.org/
Und wenn Du Dir die Seite ansiehst, dann wird auch schnell klar, was da dann direkt für eine Komplexität entstanden ist intern:
  • Message Queuing kommt da rein - hier mit ActiveMQ
  • Apache Camel kommt rein für diverse Dinge um die Steuerung intern zu beeinflussen (um es mal ganz grob zu beschreiben - Link folgen und ansehen!)
  • Persistency ist wichtig - JPA kommt da ins Spiel
  • Ggf. willst Du Transaktionen haben? Distributed Transactions (XA Transactions) sind doch was feines ... Das, was die Entwickler bei Microservices scheuen wie der Teufel das Weihwasser will doch kein Masochist Links liegen lassen 🙂

Das wäre also evtl. das, was Dich interessieren könnte. Neben Apache gibt es da natürlich auch noch andere Libraries, die sowas machen....
Ich habe es geschafft, ich lag leider falsch und ihr alle habt mir klar gemacht, was ich machen sollte.. Also habe ich drei Module Client, Server und Common erstellt. Common enthält die Nachrichtenklassen die zwischen Client und Server ausgetauscht werden. Wenn Client zu dem Server irgendwas sendet, wird erstmal in der Nachrichtenklasse z.B LoginRequest gespeichert und nachdem sie auf den Server angekommen ist, wird durch eventBuss auf dem Server gepostet, entsprechend wird sie durch @Subscribe auf dem Server abgefangen und verarbeitet das gleiche passiert auf dem Client.

oh mein Gott,

Vielen Dank noch Mal.
 

Neue Themen


Zurück
Oben