# socket.close aber verbindung besteht noch



## Thaflasher (9. Nov 2011)

Hi Forum,

ich hab hier ein generelles Verständnisproblem zum Thema Verbindungen, Sockets und die Trennung dieser Verbindungen bzw. Sockets:

Ich habe einen Client:


```
public void startConnect() throws IllegalArgumentException, IOException{
		Socket socket = new Socket();
		SocketAddress remoteBindPoint = new InetSocketAddress(serveraddress, port);

		try{
		socket.connect(remoteBindPoint, 5000);
		}
		catch (IOException e){
		}
		sendData(socket.getOutputStream());
		socket.close();
	}
	
	public void sendData(OutputStream out){
		DataOutputStream dos = new DataOutputStream(out);
		for (int i = 0; i < instructions.size(); i++) {
			try {
				dos.writeUTF(instructions.get(i));
			} catch (IOException e) {

			}
		}
		try {
			dos.flush();
			dos.close();
		} catch (IOException e) {
			
		}
		
	}
```

und einen Server:


```
public void receiveData(InetAddress ia, int port, InputStream is) {
		DataInputStream dis = new DataInputStream(is);
		ArrayList<String> receiveList = new ArrayList<String>();
		
		while(true){
			try {
				String holder = dis.readUTF();
				receiveList.add(holder);
			} catch (EOFException e) {
				break;
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		receiverQueue.offer(new Worker(ia, port, receiveList));
		try {
			dis.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	@Override
	public void run() {
		try {
			while(true){
			ServerSocket sskt = new ServerSocket(port);
			Socket socket = sskt.accept();
			System.out.println("Connected");
			
			receiveData(socket.getInetAddress(), socket.getPort(),socket.getInputStream());
			
			System.out.println("rdy");
			sskt.close();
			System.out.println("ServerSocket closed? " + sskt.isClosed());
			socket.close();
			System.out.println("socket connected?: " + socket.isConnected());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
```

Was ich versuche ist die beiden Verbindungen zu trennen und den Server quasi für eine neue Verbindung frei zu machen.

Ich dachte wenn ich alle Sockets schließe (.close() ) endet damit auch die Verbindung.

Leider liefert mir socket.isConnected() immer true zurück, obwohl socket.isclosed() mir auch true zurück liefert. Das gleiche hab ich im Client d.h. wenn ich mich kurz darauf neu verbinden möchte bekomme ich eine socketException: Already connected, onwohl ich auch alle Sockets geschlossen habe. ???:L

Hab ich an der ganzen Socket-Geschichte was falsch verstanden?

Danke im voraus!


----------



## Nightmares (9. Nov 2011)

Wenn du den Socket schließt und dieser zu diesem Zeitpunkt verbunden war dann wird diese Wert nicht mehr verändert und bleibt auf true. Ein geschlossener Socket ist auf immer und ewig zu. Er kann nicht mehr geöffnet werden.

Socket (Java Platform SE 7 ) close()


Socket (Java Platform SE 7 ) isConnected()

"isConnected
public boolean isConnected()
Returns the connection state of the socket.
Note: Closing a socket doesn't clear its connection state, which means this method will return true for a closed socket (see isClosed()) if it was successfuly connected prior to being closed.

Returns:
true if the socket was successfuly connected to a server
Since:
1.4"


----------



## Thaflasher (9. Nov 2011)

Das klärt alle Fragen! 

Danke vielmals.


----------



## SlaterB (9. Nov 2011)

erklärt allerdings eher nicht eine 'socketException: Already connected'..


----------



## Thaflasher (9. Nov 2011)

Bedauerlicherweise hast du recht. :-( Es scheint als würde die Verbindung im Hintergrund weiter laufen auch wenn niemand darauf zugreifen kann, da der Socket geschlossen ist.

Habe jetzt 
	
	
	
	





```
socket.setReuseAddress(true);
```
 hinzugefügt, da es den Port direkt nach dem close() wieder frei gibt. Jetzt scheint es relativ stabil zu laufen (- relativ da, wenn ich eine paar Minuten nichts mache,  ich auf die nächste Serveranfrage eine "no route to host" - exception bekomme °(X.x)° obwohl ich mich 2-3 Minuten vorher noch erfolgreich verbunden hatte. Heute scheint nicht mein Tag zu sein).

Trotzdem Danke für die schnellen Antworten


----------

