Sockets oder RMI?

Ronin-Jay

Erfahrenes Mitglied
Hallo zusammen.
Ich stehe vor einer grundlegenden Entscheidung und wollte mal Eure Meinung hören.

Ich werde eine JAVA-Applikation in SWT programmieren, die eine Client-Server Struktur erfordert (Essensausgabesystem mit Anzeigemonitoren) und weiß nicht, was besser ist in Sachen Netzwerkkommunikation: RMI oder Sockets?

Dazu habe ich mir 2 simple Konsolenprogramme erstellt, welche einmal per Socket und einmal per RMI mit dem Server kommunizieren. Bei beiden habe ich das Problem, das wenn der Server weg ist (einmal beendet und danach neu gestartet), die Clients Exceptions werfen. Das sollte nachher im produktiven Umfeld natürlich nicht sein...

Daher meine Frage an Euch: Ist es sinnvoller Sockets zu nutzen oder lieber RMI? Wie fange ich es ab, daß der Server teilweise mal nicht erreichbar sein kann (zum Beispiel Netzwerkstöungen)? Gibt es da überhaupt Möglichkeiten?

Da ich mit Netzwerkprogrammierung leider noch gar keine Erfahrung habe, würde ich mich auf ein Statement von Euch freuen.
 
Hallo,

wenn du wirklich einen zentralen Server hast auf den mehrere Clients zugreifen sollen, empfehle ich auf jeden Fall RMI zu nutzen. Sollen die Clients direkt miteinander kommunizieren können würde ich Sockets nehmen.
Als alternative zu RMI kannst du mal nach JINI googeln.
Als alternative zu Sockets wäre evtl auch JXTA zu gebrauchen.

Die Frage wie du es abfängst wenn der Server nicht erreichbar ist verstehe ich nicht ganz. Wenn du eine Exception bekommst merkst du das doch und kannst darauf reagieren wie du möchtest. Wenn im Internet ein Server mal kurzfristig nicht erreichbar ist, musst du die Seite ja auch neu laden. Wo ist genau dein Problem?
 
Hallo,

ich würde dir empfehlen RMI zu verwenden. Das ist einfacher zu verwenden, da mehr HighLevel als Low Level bitschieberei über Sockets.
Da RMI auch auf Sockets aufbaut kannst du natürlich auch die RMI Runtime entsprechend konfigurieren (TimeOuts etc.). Wenn eine Verbindung abbricht bekommst du eben auf dem Client eine RemoteException. Diese musst du dann fangen und entsprechend reagieren.... entweder ein Reconnect oder Neustart der Anwendung (das lässt sich übrigens ausgezeichnet per AOP (beispielsweise per AspectJ) als Aspect transparent realisieren).

Gruß Tom
 
Hallo Thomas, hallo Inskin,

vielen Dank Euch zwei erst mal für die Antworten.

@Inskin:
Die Frage wie du es abfängst wenn der Server nicht erreichbar ist verstehe ich nicht ganz. Wenn du eine Exception bekommst merkst du das doch und kannst darauf reagieren wie du möchtest. Wenn im Internet ein Server mal kurzfristig nicht erreichbar ist, musst du die Seite ja auch neu laden. Wo ist genau dein Problem?
Ja, ich hatte versucht die Exceptions zu finden und dementsprechend abzufangen, aber manchmal sieht man einfach den Wald vor lauter Bäumen nicht mehr. Heute morgen, als ich Eure Posts gelesen habe, bekam ich dann den richtigen Einfall und nun reconnected er bei Serververlust.


@Thomas:
.... entweder ein Reconnect oder Neustart der Anwendung (das lässt sich übrigens ausgezeichnet per AOP (beispielsweise per AspectJ) als Aspect transparent realisieren).
Den Reconnect habe ich nun über die RemoteException realisiert bekommen, aber was ist der Unterschied zum kompletten Neustart der Applikation? Was ist empfehlenswerter/sinnvoller? Ich denke der einfache Reconnect wird für mich erst mal ausreichend sein (Reconnect im bestimmten Intervall, falls Server länger nicht zu erreichen ist, bzw. Abbruch des Reconnects, falls Server x-Mal nicht erreicht wurde).
 
Zurück