Zum Inhalt springen

reconnect für Server


elSusto

Empfohlene Beiträge

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

...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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:D

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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ß.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...