# Socket schliessen



## MaLb (29. Dezember 2006)

Nachfolgend ein Stück meines Clientquellcodes. Obwohl ich den Socket schließe wird mir die Verbindung noch immer als existierend angezeigt. Mittels Windows:netstats kann ich auch sehen dass noch ein Port geöffnet ist. Sollte der nicht eigentlich nach dem Befehl socket.close() geschlossen werden?


```
in.close();
            out.close();
            oos.close();
            sock.close();
            
            if (debug == true)
            {
                log("Socket ist gebunden: " + sock.isBound());
                log("Socket ist verbunden: " + sock.isConnected());
                log("Socket ist geschlossen: " + sock.isClosed());
                log("Socket Inputshutdown? " + sock.isInputShutdown());
                log("Socket Outputshutdown? " + sock.isOutputShutdown());
            }
```

_PdmTalkClient: [Socket ist gebunden: true]
PdmTalkClient: [Socket ist verbunden: true]
PdmTalkClient: [Socket ist geschlossen: true]
PdmTalkClient: [Socket Inputshutdown? true]
PdmTalkClient: [Socket Outputshutdown? true]_


----------



## andy72 (29. Dezember 2006)

hi,

bei mir funktioniert das so (auch mit netstat -a) besser:

  public void close() {
    try {
      SOCKET.close();
      SOCKET.shutdownInput();
      SOCKET.shutdownOutput();
      out.close();
      streamReader.close();
      connected = false;
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }

LG
Andy


----------



## Thomas Darimont (29. Dezember 2006)

Hallo!

Wenn du den Port an den ein Socket gebunden ist möglichst schnell schließen möchtests könntest du mit einer entsprechenden SoLinger Einstellung am Socket das "close" TimeOut manipulieren.

```
package de.tutorials;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 * TODO Description of the type
 * </p>
 * @author Thomas.Darimont
 */
public class SocketExample {

  /**
   * <p>
   * TODO Description of method
   * </p>
   * @param args
   */
  public static void main(String[] args) {
    final ExecutorService server = Executors.newSingleThreadExecutor();
    server.execute(new Runnable() {
      public void run() {
        try {
          ServerSocket ss = new ServerSocket(1984);
          Socket s = ss.accept();
          s.setSoLinger(true,0);

          try {
            TimeUnit.SECONDS.sleep(5);
          } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }

          s.close();
          ss.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
        server.shutdownNow();
      }
    });


    final ExecutorService client = Executors.newSingleThreadExecutor();
    client.execute(new Runnable() {
      public void run() {
        try {
          Socket socket = new Socket("localhost",1984);
          //socket.setSoLinger(true,0); reicht auf ServerSeite ;-)
          try {
            TimeUnit.SECONDS.sleep(5);
          } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }

          socket.close();
        } catch (UnknownHostException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        client.shutdownNow();
      }});
  }
}
```

Dann verschwindet der Port unmittelbar in der netstat -a Auflistung.

Gruß Tom


----------



## MaLb (29. Dezember 2006)

andy72 hat gesagt.:


> hi,
> 
> bei mir funktioniert das so (auch mit netstat -a) besser:
> 
> ...


Also wenn ich den Socket vor den eigentlichen In/Out Streams schließe, dann erhalte ich aber eine Exception!!

Wenn ich eine Socketverbindung von einem Client zu einem Server / ServerThread aufbaue, dann müsste es doch eigentlich reichen wenn der Client die Verbindung mittels sock.close trennt (die Streams werden meines Wissens nach gleich mitgekappt, aber nichts desto trotz schließe ich sie ja noch explizit), der Server erhällt einen Timeout (bei mir 2 Sekunden) und daraufhin müsste der Port doch geschlossen werden. Bei meinem Programm senden sowohl Server - Thread als auch Client ein sock.close() aber trotzdem ist der Port noch für eine gute Minute offen...
Gibt es nicht ein sock.StirbSofortAufDerStelleUndGibDenPortFrei() 
Oder muss ich damit leben?


----------



## MaLb (29. Dezember 2006)

@Tom
Habe deine Antwort leider zu spät gelesen. Genau so funktionierts!
Danke


----------

