# Android: Socket.isConnected funktioniert nicht



## freez (8. Mai 2011)

Hallo, 

ich habe Android 2.2 und möchte eine Socket Verbindung zu einem SocketServer (auf WindowsPC) aufbauen.

Mein Problem ist, dass ich im Handy nicht sauber abfragen kann, ob die Verbindung steht. Normalerweise sollte Socket.isConnected() sauber melden, aber ich bekomme immer true zurück. Lediglich mein PrintWriter fällt dann auf die Schn***e, und ich kann PrintWriter.checkError() abfragen. Leider aber erst, nachdem ich was geschrieben habe.

Wie kann ich den Status des Sockets sauber abfragen? Oder warum geht "isConnected" in Android nicht?

Beispiel:

```
s = new Socket("192.168.2.105",33333);
PrintWriter out = new PrintWriter(s.getOutputStream(), true);
while(!cancelTask && s.isConnected()){
	out.println("test");
	out.flush();
	String s = 	"checkError=" + out.checkError() + 
			"; connected=" + s.isConnected() +
			"; bound=" + s.isBound() +
			"; closed=" + s.isClosed() +
			"; inputShutdown=" + s.isInputShutdown() +
			"; outputShutdown=" + s.isOutputShutdown();
						
			publishProgress("status", s);
			if(checkError)
				break; //Fehler bei der Datenübertragung ...  Connectio Abbrechen und neu Starten
```


----------



## freez (8. Mai 2011)

Übrigens habe ich das Ganze auch auf einem WindowsClient getestet und dort funktioniert es wie gewollt.


----------



## areafo (9. Mai 2011)

Bekommst du den Fehler direkt vom Gerät oder in einer emulierten AVD? Normalerweise muss das so funktionieren. Übrigens meiner Anfänger Meinung nach kannst du dir das out.flush(); sparen, da du im Print Writer schon Autoflush auf True hast?

Vielleicht auch mit setKeepAlive and getKeepAlive im Socket arbeiten um sicherzustellen das die Verbindung dauerhaft besteht?

Hoffe ich konnte wenigstens etwas helfen. Stehe da auch noch am Anfang ^^.


----------



## freez (16. Mai 2011)

Direkt vom Gerät. Danke für den Tipp mit dem KeepAlive. Werde es mal testen, ob es besser geht.

Das Phänomen ist jetzt sehr sonderlich. Mal funktioniert es, und mal geht es nicht. Mit dem selben Code. Kennt jemand dieses Verhalten? Was kann man da machen?


----------



## michael p (31. Mai 2011)

Das kommt mir von einer anderen Sache bekannt vor. Ähnlich Konstellation:
im While-Kopf wird als Bedingung eine Methode ausgeführt, die sehr schnell ist, in deinem Fall isConnected
Im While-Body ist eine Funktion die sehr sehr viel langsamer ist, in deinem Fall println.

isConnected wird sehr schnell ausgeführt, da es direkt die Infos vom Gerät bekommt. 
println dauert ziemlich lange. Es ist ja auch noch TCP, das bedeutet es muss auch noch auf eine Atwort warten.

Es ist also wahrscheinlicher, dass wenn bei dir kurzfristig die Netzverbindung zusammenbricht, eher println grad abgearbeitet wird, als
isConnected. 

Wobei es TCP eigentlich nicht stören muss, wenn hin und wieder das Netz zusammenbricht, dann sendet es
einfach nochmal. Bedeutet bei dir, dass die Netzverbindung manchmal auch länger zusammenbricht, sodass das TCP
nach eingen Versuchen aufgibt und auf der anderen Seite, dass das Senden manchmal klappt. 

Einzige Lösung fang den Fehler auf und send erneut.


----------

