# schreiben auf geschlossenen Socket ohne Exception



## muge (28. Feb 2005)

Hallo zusammen

Folgendes Szenario:

Ein Server wartet auf eine Verbindung. Der Client eröffnet die Verbindung, schreibt auf den Socket und schliesst den Socket wieder. isClosed() im client gibt erwartungsgemäss true zurück.
Nachdem ich vom client die Meldung erhalten habe, dass der Socket geschlossen wurde, kommt mal die Nachricht vom Server (System.out), dass er eine Verbindung bekommen hat (schon mal komisch. Wieso erst jetzt? gut, eventuell gibt es Verzögerungen mit dem System.out...).
Nun schreibt der Server gemütlich eine Antwort an den Client, über einen Socket der vom Client schon geschlossen worden ist (auf alle Fälle behauptet er das). Es wird keine Exception geworfen. Ist da die JVM am buffern oder was?

Ich wäre sehr froh, wenn mir jemand sagen könnte, wie dieses Verhalten zustande kommen kann. Für meine Applikation ist es enorm wichtig, dass ich nur Nachrichten auf einen Socket schreiben kann, der auch wirklich noch aktiv ist.

Ich benutze Netbeans 4.0 mit jdk 1.5 unter Windows XP.

thx muge


----------



## youssef (28. Feb 2005)

Hallo,
leider gibt es keine zuverlässige methode die aussagt ob ein socket noch lebt oder nicht. um das zu prüfen bleibt nur die möglichkeit daten zu schreiben und auf eine exception warten. mit printstack()  kannst du die meldung ausgeben . in diesem fall muss die meldung "socket is closed" ausgegeben.
was du machen kannst ist eine verzögerung auf der clientseite einzubauen direkt nach dem socket aufbau bis der server antwortet.

```
try {
			Thread.sleep(delaytime in ms);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
```


----------



## Bleiglanz (28. Feb 2005)

am besten der Client schickt schnell eine Nachricht, dass er keine Lust mehr hat (das dürfte am einfachsten sein)

ansonsten schau mal in die API, da gibts diverse Timeouts etc. einzustellen


----------



## muge (28. Feb 2005)

Bleiglanz hat gesagt.:
			
		

> am besten der Client schickt schnell eine Nachricht, dass er keine Lust mehr hat (das dürfte am einfachsten sein)



Was meinst du damit genau?

Ich muss den Fall abfangen, dass z.B ein gezogenes Netzwerkkabel oder ein Systemabsturz des Servers/Clients während der Kommunikation richtig detektiert wird. Es darf nichts verloren gehen. Wenn nicht gesendet werden kann, muss der Client / Server das merken.


----------



## Sky (28. Feb 2005)

Naja, einfach die Gegenseite antworten lassen: Du schickst was, die Gegenseite schickt was zurück (z.B. eine '0' oder ein 'true', was auch immer)


----------



## muge (28. Feb 2005)

Das werde ich wohl tun müssen... mit all den folgeproblemen...

Wäre der Einsatz von JMS eine Lösung? Kennt sich da Jemand gut aus?

Danke für die Hilfe
muge


----------



## muge (2. Mrz 2005)

Nun kriege ich die Exception, wenn ich auf einen schon geschlossenen Socket schreiben will .
Das Problem, weshalb es bisher nicht geklappt hat, waren die Streams. Bisher habe ich mit PrintStream auf den Socket geschrieben, der keine Exception geworfen hat (also bis ca. 1 Minute, länger habe ich nicht gewartet).
Wenn ich aber direkt in den OutputStream schreibe, dann funktioniert es.

cya
muge


----------

