2 Stimmen

Client-Server-Kommunikation in Java - welcher Ansatz ist zu wählen?

Ich habe eine typische Client-Server-Kommunikation: Der Client sendet Daten an den Server, der Server verarbeitet sie und sendet sie an den Client zurück. Das Problem ist, dass die Verarbeitung ziemlich viel Zeit in Anspruch nehmen kann - in der Größenordnung von Minuten. Es gibt ein paar Ansätze, die zur Lösung dieses Problems verwendet werden könnten.

  1. Stellen Sie eine Verbindung her und halten Sie sie aufrecht, bis der Vorgang abgeschlossen ist und der Client die Antwort erhält.
  2. Verbindung aufbauen, Daten senden, Verbindung schließen. Nun findet die Verarbeitung statt, und sobald sie abgeschlossen ist, könnte der Server eine Verbindung zum Client herstellen, um die Daten zu senden.
  3. Verbindung aufbauen, Daten senden, Verbindung schließen. Die Verarbeitung findet statt. Der Client fragt den Server alle n Minuten/Sekunden, ob der Vorgang abgeschlossen ist. Wenn die Verarbeitung abgeschlossen ist, holt der Client die Daten ab.

Ich habe mich gefragt, welcher Ansatz der beste wäre. Gibt es vielleicht einen "de facto" Standard für die Lösung dieses Problems? Wie "teuer" ist das Öffnen eines Sockets in Java? Lösung 1. scheint mir ziemlich unangenehm zu sein, aber 2. und 3. könnten funktionieren. Das Problem bei Lösung 2. ist, dass der Server wissen muss, auf welchem Port der Client lauscht, während Lösung 3. einen gewissen Netzwerk-Overhead verursacht.

2voto

Igor Artamonov Punkte 34640
  1. ist gut genug
  2. wird in vielen Situationen nicht funktionieren, z.B. wenn der Client unter einer Firewall, NAT usw. steht. Server akzeptieren normalerweise eingehende Verbindungen von überall her, Desktops normalerweise nicht
  3. besser als 1, weil Sie keine Probleme haben werden, wenn die Verbindung unterbrochen wird
  4. Lösungen 1+3 - lange wartende Verbindungen herstellen, mit periodischem Sleep und anschließendem Reconnect. Ich meine: Verbindung zum Server herstellen, 30 Sekunden auf Daten warten, wenn keine Daten empfangen werden, 10 Sekunden schlafen, Schleife.

Das Öffnen von Steckdosen ist manchmal teuer, aber nicht so teuer, dass Ihre Datenverarbeitung darunter leidet.

0voto

aioobe Punkte 397211

Ich sehe ein unmittelbares Problem bei Option 2. Wenn sich der Client hinter einer Firewall befindet, kann er sehr wohl eine Verbindung herstellen und die Anfrage ausführen, aber der Server kann daran gehindert werden, eine Verbindung zurück zum Client herzustellen.

Wie Sie sagen, sieht Option 1 etwas unschön aus (aber nicht zu unschön, könnte gut funktionieren), daher würde ich von den aufgeführten Optionen Option 3 wählen. Vielleicht könnte der Server die verbleibende Verarbeitungszeit abschätzen und den Client bei jeder Abfrage darauf hinweisen, wann es an der Zeit ist, sich wieder zu melden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X