elSusto Geschrieben 19. November 2008 Geschrieben 19. November 2008 hallo, ich suche eine möglichkeit festzustellen, wenn ich keine Verbindung mehr zum Clienten habe. Wenn diese abgebrochen ist sollte der Server sich neu starten und wieder auf eine verbindung warten. habs mit Socket.isConnected() versucht und mit Socket.isClose() der Server läuft auch soweit nur das er halt beendet wird wenn der client nicht mehr zum server connected ist. rufe die infomationen vom Server mit -> telnet localhost "Port" <- ab. Gruß.:hells: Zitieren
speedi Geschrieben 19. November 2008 Geschrieben 19. November 2008 Ich kenne leider die Architektur deiner Software nicht aber ich gehe mal davon aus du befindest dich was Socket-Programmierung angeht noch in der lernphase. Wenn die Verbindung abreißt bekommst du beim lesen des InputStreams vom Socket eine Exception. Wenn du das abfängst kannst du entsprechende Schritte einleiten. Aber eigentlich sollte das bei einer sauberen Programmierung gar nicht so nötig sein. lass doch deinen ServerSocket in einer Schleife die Verbindungen annehmen und starte dann da drin in einem neuen Thread die Bearbeitung des Sockets. So ist es ziemlich wursch wie viele Clients sich zum Server verbinden und ob mal eine Verbindung abreißt. while(true){ Socket s = deinServerSocket().accept(); new ClientConnection(s); } Dann kannst du auch mehrere Telnet-Clients parallel zum Server verbinden. Zitieren
elSusto Geschrieben 20. November 2008 Autor Geschrieben 20. November 2008 Danke =) ..das war genau das was ich gesucht habe :uli das wäre der nächste schritt gewesen, also das sich beliebig viele clients verbinden können =) Und das ich erst in der lernphase bin, das stimmt. aber jeder fängt ja mal klein an :bimei Zitieren
elSusto Geschrieben 20. November 2008 Autor Geschrieben 20. November 2008 ...und schon habe ich das nächste problem. Ich muss die Klasse dynamisch laden. Weswegen ich den Ein normales Objekt in der while schleife habe und keinen Thread. @Override public void run() { if (m_Map.containsKey("DataQueue2") != true) { System.out.println("Send Thread >>> erwartet Typ Queue (name: DataQueue2) \n in property.ini berichtigen!" ); this.interrupt(); } else { try { serverSock = new ServerSocket(m_IntPort); } catch (IOException e) { System.err.println(e + "<<< FEHLER \n <<< fuer diesen Port besteht bereits ein Dienst,\n bitte waehlen sie einen anderen Port!"); } while (! interrupted()) { try { clientSock = serverSock.accept(); } catch (IOException e2) { System.out.println(e2 + " <<< FEHLER"); } Object sendThread = loadClass("ClientConnectionTCP"); ((ClientConnectionInterface)sendThread).setClientSocket(clientSock); ((ClientConnectionInterface)sendThread).setMap(m_Map); ((Thread)sendThread).start(); } try { clientSock.close(); serverSock.close(); } catch (IOException e) { System.err.println(e + "<<< FEHLER <<< ...beim schliesen der Verbindung"); } } } public static Object loadClass(String PV_StrClassName) { Class<?> class_Load = null; try { class_Load = Class.forName(PV_StrClassName); } catch (ClassNotFoundException e2) { e2.printStackTrace(); } Object threadObject = null; try { threadObject = class_Load.newInstance(); } catch (InstantiationException e2) { e2.printStackTrace(); } catch (IllegalAccessException e2) { e2.printStackTrace(); } return threadObject; } das ist mein code den ich bis jetzt geschrieben habe. die setter methoden brauch ich weil ich mit threadObject = class_Load.newInstance(); keine Parameter übergeben kann. lass doch deinen ServerSocket in einer Schleife die Verbindungen annehmen und starte dann da drin in einem neuen Thread die Bearbeitung des Sockets. So ist es ziemlich wursch wie viele Clients sich zum Server verbinden und ob mal eine Verbindung abreißt. Code: while(true){ Socket s = deinServerSocket().accept(); new ClientConnection(s); } ist die while schleife jetzt korrekt die ich geschrieben habe? bin mir da nich so sicher, weil ich ja ein Objekt in der while schleife habe und kein Thread. Zitieren
speedi Geschrieben 20. November 2008 Geschrieben 20. November 2008 deine Schleife schaut eigetlich ganz gut aus. Du wie es aussieht, hast du in deiner while()-Schleife keinerlei Anweisungen die längere Zeit dauern, so dass der ziemlich sofort nach der Verbindungsannahme wieder eine neue Verbindung angenommen werden kann. Allderdings solltest du in der while-Schleife alles ins try{...} reinschreiben. Denn überlege dir was passiert wenn während clientSock = serverSock.accept(); ein Fehler auftritt. Dann ist clientSock null bei ((ClientConnectionInterface)sendThread).setClientSocket(clientSock); Wenn die aber alles im try{...} hast kommt diese Zeile gar nicht erst zur Ausführung. Wieso soll dein Objekt in der Schleife kein Thread sein? Immerhin castest du doch auf Thread? ((Thread)sendThread).start(); Oder meinst du dass das Interface(ClientConnectionInterface), dem die dynamisch geladene Klasse entsprechen soll nicht zwangsläufig erfordert dass es ein Thread ist? Das könntest du umgehen indem du in deinem Interface eine "run"-Methode festlegst und dann in der Schleife so etwas machst: while (! interrupted()){ try { clientSock = serverSock.accept(); final Object sendThread = loadClass("ClientConnectionTCP"); ((ClientConnectionInterface)sendThread).setClientSocket(clientSock); ((ClientConnectionInterface)sendThread).setMap(m_Map); new Thread(){ public void run(){ ((ClientConnectionInterface)sendThread).run(); } }.start(); } catch (IOException e2) { System.out.println(e2 + " <<< FEHLER"); } } Dann wäre dein sendThread zwar keine eigene Klasse, aber seine run-Methode läuft in einem eigenen Thread. Zitieren
elSusto Geschrieben 20. November 2008 Autor Geschrieben 20. November 2008 thx =) hab jetzt die run methode mit im interface. funktionier auch alles wunderbar! =) --------------------------------------- PrintWriter write = new PrintWriter(clientSock.getOutputStream()); while (true) { write.println("someText"); write.flush(); } wenn sich der client beendet soll das programm aus dieser while schleife raus springen. hab mir das so gedacht: while (true) { try{ write.println("someText"); write.flush(); }catch(Exception e) { break; } } aber i-wie bekomm ich da keine Exception =( aber eigentlich müsste ich doch eine bekommen da "write" doch mit dem clienten verbunden ist und nichts mehr schreiben kann. das versteh ich i-wie nicht so richtig. Zitieren
elSusto Geschrieben 20. November 2008 Autor Geschrieben 20. November 2008 nochmal kurz ne kleine Frage ich hab ja: serverSock.accept(); kann ich dafür nen Timeout definieren? also das er alle x sekunden kontrolliert ob der Thread mit interrupt unterbrochen wurde und wenn dies nicht der fall ist wartet er wieder auf eine verbindung. Zitieren
speedi Geschrieben 20. November 2008 Geschrieben 20. November 2008 Du neigst zu umständlichen Lösungen^^ try{ while (true) { write.println("someText"); write.flush(); } }catch(Exception e) { break; } Wenn jetzt eine Exception autritt (= Client-Verbindung abgerissen/beendet) ist die Schleife auch automatisch weg. Zitieren
speedi Geschrieben 20. November 2008 Geschrieben 20. November 2008 kann ich dafür nen Timeout definieren? Damit du den Server-Teil über einen Exit-Button beenden kannst ohne dein ganzes Java-Programm abschießen zu müssen? Lass am besten die Schleife für die Verbindungsannahme (client.accept()) ebenfalls in einem Thread laufen den du dann einfach killst. Zitieren
elSusto Geschrieben 20. November 2008 Autor Geschrieben 20. November 2008 Damit du den Server-Teil über einen Exit-Button beenden kannst ohne dein ganzes Java-Programm abschießen zu müssen? naja Buttons hab ich nicht, das ganze läuft über die Konsole^^ der Thread bleibt doch bei serverSock.accept()stehen also merkt der doch gar nicht wenn ich .interrupt(); aufrufe. oder welche andere möglichkeit gibt es den Thread zu killen? zum anderen: try{ while (true) { write.println("someText"); write.flush(); } }catch(Exception e) { break; } hier ist das Problem das ich keine Exception bekomme wenn die verbindung abreißt :-( [QOUTE]Du neigst zu umständlichen Lösungen^^[/QOUTE] da hast du wohl recht , das sagen mir alle immer wieder hat in der ersten klasse im Mathe unterricht angefangen :D Zitieren
speedi Geschrieben 20. November 2008 Geschrieben 20. November 2008 Was? Wenn du dem Client was sendest, aber der Client schon längst beendet wurde bekommst du keine Exception?? Das kann eigentlich gar nicht sein. Den ServerThread kannst du theoretisch mit thread.stop() abwürgen. Allerdings ist die Methode depracated. Es gibt sicher noch andere Möglichkeiten die schöner sind. Aber das man server.accept() nach x-Milliskeunden beenden könnte ist mir jetzt nicht bekannt. Eventuell gibt es eine möglichkeit einen non-blocking ServerSocket zu erstellen (am besten mal googeln). Dann würde dir server.accept() halt alle x-ms null zurückliefern wenn kein neuer Client verbunden wird. Zitieren
elSusto Geschrieben 20. November 2008 Autor Geschrieben 20. November 2008 ja ich versteh das auch nicht warum ich da keine exception bekomme. ich implementiere einfach mal nen kleines prog das auch daten sendet und guck ob ich da dann die exception bekomme... danke für den tip mit den non-blocking Sockets. denk mal das mich das in der richtung weiterbringen wird. Zitieren
elSusto Geschrieben 21. November 2008 Autor Geschrieben 21. November 2008 das problem das ich keine Exception bekomme habe ich gelöst =) hier mal der code: PrintWriter write = new PrintWriter(clientSock.getOutputStream()); while(true) { write.println("someText"); write.flush(); if(write.checkError()) { break; } } write.checkError() liefert false wenn es korrekt gesendet wurde und true wenn ein Fehler auftrat. Und das mit dem Timeout ist auch gelöst =) try { serverSock.setSoTimeout(20); clientSock = serverSock.accept(); write = new PrintWriter(clientSock.getOutputStream()); } catch (SocketTimeoutException e){ // my Exception handling } Danke speedi für deine Hilfe:e@sy Gruß. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.