# einfache Frage zu ServerSocket ...



## gilioner (4. Nov 2003)

Hallo,

wenn ich ein ServerSocket erstelle und sich ein Client verbindet, möchte ich solange Nachrichten des Clients auslesen, bis die Verbindung clientseitig geschlossen wird.

Nur weiß ich nicht, wie der Server erfahren kann, ob eine Verbindung geschlossen wurde.

Hier mein Codeausschnitt:

Server:

```
try{
			ServerSocket server = new ServerSocket(6000);
			int count=0;
			while(true)
			{
				System.out.println("Server wurde gestartet (Port "+server.getLocalPort()+")");
				Socket socket = server.accept();
				BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				String clientwrite="";
				while(!clientwrite.equalsIgnoreCase("bye"))
				{
						clientwrite = in.readLine();
						System.out.println("Client sagt: "+clientwrite);
				}
				in.close();
				socket.close();
			}
		}catch(Exception e)
		{
			System.out.println("Fehler");
		}
```

Client:

```
try
		{
			Socket client = new Socket("localhost",6000);
			//OutputStream out = client.getOutputStream();
			//OutputStreamWriter writer = new OutputStreamWriter(client.getOutputStream());
			BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
			writer.write("test\n");
			writer.write("bye\n");
			writer.close();
			client.close();
		}catch(Exception e)
		{
			System.err.println("Fehler: "+e.getMessage());
		}
```

Statt 
	
	
	
	





```
while(!clientwrite.equalsIgnoreCase("bye"))
```
 möchte ich eine Überprüfung haben, ob die Verbindung vom Clienten schon geschlossen wurde (also 
	
	
	
	





```
client.close()
```
ausgeführt wurde).

```
!socket.isClosed()
```
 oder 
	
	
	
	





```
socket.isConnected()
```
 ist immer true, solange die Verbindung nicht vom SERVER geschlossen wurde.

Wie kriege ich das hin?

Vielen Dank 


MfG
gilioner


----------



## stev.glasow (6. Nov 2003)

weis nicht genau was du meinst, aber das while(!clientwrite.equalsIgnoreCase("bye")) muss durch while(server.isConnected()) ersetzt werden.

war's das was du wissen wolltest ?


----------



## Freddy (10. Nov 2003)

_ServerSocket_ definiert keine Methode _isConnected()_. Außerdem wäre das in diesem Fall sinnlos, da nur der Server selbst seinen eigenen Socket schließen kann. Er möchte viel mehr wissen, wie er herausbekommt, ob der Client seine Verbindung geschlossen hat.
Ich programmiere einen Chat und zerbreche mir jetzt seit knapp einem Jahr den Kopf über dieses Problem. Ich habe es auch mit den Methoden _isClosed()_ usw. probiert, aber das geht nicht, da diese nur lokale Veränderungen anzeigen (wenn man z.B. _Socket.close()_ aufruft). Es scheint so, als ob man dem Client etwas senden muss, um zu prüfen, ob die Verbindung noch besteht. Wenn beim Aufruf von _write()_ eine Exception auftritt, dann wurde die Verbindung abgeschlossen.
Allerdings habe ich schon Chatsysteme gesehen, die das anders lösen, nur bin ich bisher nicht dahintergekommen, wie.


----------



## Jiriki (10. Nov 2003)

nen chat client muss ich in den nächsten 1-3 wochen auf programmieren
werd dir dann mal mein programm posten
dauert aber noch ne weile....


----------



## Ebenius (18. Nov 2003)

Mir ist keine Möglichkeit bekannt direkt am Socket benachrichtigt zu werden, wenn die Gegenseite den eigenen Socket schließt. Da diese Möglichkeit meines Kenntnisstandes nicht existiert, bleiben folgende (vielleicht weitere) Alternativen:

* Bidirektionale Kommunikation zwischen Client und Server. Regelmäßige Abfrage des Clients vom Server aus (Request-Response). 
* Stream-close-signature (z.B. "bye"-string) und timeout, wobei dann besser ein ordentlich definitiertes und implementiertes Protokoll genutzt werden sollte.
* Kombination aus 1 und 2 (sehr oft zweckmäßig)

Was anderes fällt mir nicht ein.

Grüße
Ebenius[/code]


----------



## Freddy (26. Nov 2003)

Es gibt eine Möglichkeit ohne irgendwelche "Pings": Die Methode _SocketInputStream.read()_ wirft eine _IOException_, sobald die Gegenseite die Verbindung (sauber) schließt. Eigentlich sollte dein _BufferedReader_ dies auch tun. Deswegen wäre es besser, die zweite Endlosschleife in einen _try_-Block zu packen.
Ich nutze dieses Prinzip in abgewandelter Form jetzt auch bei meinem Chat.


----------

