reconnect client java-socket
ok, ich muss ein Programm schreiben, dass kann in der Lage sein, zu erkennen, die Verbindung zwischen client und server...sobald die server schließen und zurück zu bringen meine Kunden müssen in der Lage sein, um verbinden Sie es wieder auf den server..aber ich bin wirklich nicht sicher, wie zu es tun...keine Hilfe, wenn möglich?
public TEST(String serverIP, int serverPort){
Log("Connection to the Server....");
try{
socket = new Socket(serverIP, serverPort);
Log("Connected to the server : "+socket);
start();
} catch(UnknownHostException uhe){
System.out.println("Unknown Host: "+ uhe.getMessage());
} catch (IOException ioe){
System.out.println("IO Exception: "+ioe.getMessage());
}
String readline = "";
streamOutput.println("TRY test");
while(true){
try{
readline = streamInput.readLine();
System.out.println(readline);
} catch (IOException ioe){
System.out.println("Error in sending: "+ioe.getMessage());
return;
}
}
}
oben ist mein client-code, verwenden um eine Verbindung zu einem server, sobald es kompiliert ist...
- So müssen Sie die Verbindung erneut herstellen, wenn der server die Verbindung schließt?
- ja ich brauche etwas, das kann man erkennen, ob die server am Leben ist oder nicht, wenn nicht, dann wird versucht, die Verbindung erneut...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der einzige Weg zu wissen, eine Verbindung geschlossen ist, um zu versuchen, das senden von Daten über den Draht. Verbindungen nicht automatisch testen, offen/geschlossen-status. Wenn Sie prüfen wollen, für eine geschlossene Verbindung und die Verbindung wiederherzustellen, müssen Sie zum senden eines heartbeat-signal von einem zum anderen. In der Regel ist es nur ein spezielles byte oder winzige Nachricht, der sagt, die andere Seite "ich bin immer noch hier"
Aber dann, abhängig von Ihrer Anwendung können Sie nicht brauchen, die. Beide Seiten Ihrer Anwendung beginnen die Nachrichten? Oder ist es ein RMI-style-app? Wo der server nur Anforderungen empfängt?
Vielleicht so etwas?
Dies ist ein ziemlich häufiges problem (, das zu wissen, wenn das Rohr gebrochen ist) und eine der Antworten war richtig in der Herangehensweise, die besagt, dass die Client müssen, um zu 'überprüfen' der Buchse (in regelmäßigen Abständen), um zu sehen, wenn es geschlossen ist. Die Server wird nicht teilt das Client der socket geschlossen und in der Tat, nicht, weil es ist, nun, verschlossen. Firewalls, proxies und dergleichen zwischen den Client und Server möglicherweise getötet oder anderweitig blockiert socket-Kommunikation in eine oder beide Richtungen an jedem Punkt, nachdem die Verbindung hergestellt ist.
Ersten, wenn Sie getan haben eine Menge von socket-Programmierung (in C oder Java, etc) ... Sie haben gesehen, dass der "Versuch, zu schreiben, auf dem broken pipe" Typ Fehler/Ausnahme. Dies ist ein I/O-Klasse von Fehlern, wenn die Client versucht zu schreiben (senden) von Daten auf einem socket geschlossen (was nur dann erkannt zu haben, ist geschlossen worden).
So, die Antwort liegt bei der Verwaltung der socket über die Socket-Erstellung Schicht.
Ist, einen thread auf zu dem Client werden müssen, überwachen Sie die Buchse, indem das senden von Daten (die in regelmäßigen Abständen an den server als eine Art "ping" zu prüfen, eine broken-pipe-Zustand) und dann zerstören (clean-up), und erstellen Sie die Buchse (Spülen und wiederholen), wenn ein I/O-Fehler Auftritt.
Beachten Sie, dass ein komplexer bi-direktionale bisschen Logik wäre besser, die Client sicherstellen könnten, dass eine erwartete und konsistente (und rechtzeitige) Antwort vom Server für eine bestimmte 'ping'. Dies würde konkret bestätigen, die bi-Richtungs-Verkehr fließt. Ansonsten firewalls werden könnte, schließen Verkehr in eine Richtung, während der Client glaubt, es ist immer noch "reden", um die Server (kann auch Daten empfangen, aber nicht versenden kann, an den Client zurück - möglicherweise verursacht Sie, um die Verbindung zu beenden auf " Inaktivitäts-timeout).
Wenn Ihr Kunde fängt ein
SocketException
Sie sollten geben Sie Ihre tryToReconnect Zustand. Jetzt prüft es die server auf einem Intervall (- e. g. 1 Sek. vielleicht auch mehr, je nach server). Stellen Sie sicher, dass Sie implementieren eine gewisse Logik zu stoppen, wenn es nicht mehr benötigt wird.