tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Thomas Darimont
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
2203
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    MaLb MaLb ist offline Mitglied Bronze
    Registriert seit
    Dec 2006
    Beiträge
    30
    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?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
                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]
     

  2. #2
    andy72 andy72 ist offline Mitglied Platin
    Registriert seit
    Oct 2006
    Ort
    München
    Beiträge
    655
    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
     

  3. #3
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    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.
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    
    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
    saftmeister bedankt sich. 
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  4. #4
    MaLb MaLb ist offline Mitglied Bronze
    Registriert seit
    Dec 2006
    Beiträge
    30
    Zitat Zitat von andy72 Beitrag anzeigen
    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
    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?
     

  5. #5
    MaLb MaLb ist offline Mitglied Bronze
    Registriert seit
    Dec 2006
    Beiträge
    30
    @Tom
    Habe deine Antwort leider zu spät gelesen. Genau so funktionierts!
    Danke
     

Ähnliche Themen

  1. Socket aus anderem Thread schliessen
    Von StehtimSchilf im Forum .NET Web und Kommunikation
    Antworten: 4
    Letzter Beitrag: 25.06.10, 13:41
  2. Antworten: 2
    Letzter Beitrag: 30.01.08, 10:24
  3. Antworten: 2
    Letzter Beitrag: 29.01.08, 14:59
  4. Server Socket und Client Socket
    Von spiderman21 im Forum Netzwerke
    Antworten: 1
    Letzter Beitrag: 22.10.07, 01:48
  5. Socket schliessen
    Von DerKleineVomSee im Forum Java
    Antworten: 12
    Letzter Beitrag: 13.06.06, 15:52