# ServerSocket.accept() abbrechen



## MacMallow (12. Aug 2009)

Hi zusammen!

Momentan stehe ich gerade ziemlich aufm Schlauch und hoffe, dass mir hier irgendjemand helfen kann. Ich schreibe im Moment ein kleines Programm, welches u.a. eine Serverfunktionalität haben, also eingehende Verbindungen entgegennehmen soll. Dazu habe ich einen Thread mit folgender run()-Methode:


```
public void run() {
		try {
			serverSocket = new ServerSocket(port);
			while(isListening) {
				socket = serverSocket.accept();
				Thread connectionThread = new ConnectionThread(this, socket);
				connectionThread.start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
```
Der Klick auf einen Button löst nun eine Action aus, welche den Thread startet. Soweit läuft alles wie gewollt. Mein Problem ist nun, dass es auch möglich sein soll, den Thread auf die gleiche Weise wieder zu stoppen, also durch Klick auf einen Button. Die dazugehörige Action soll einfach "isListening" auf false setzen, wodurch die Schleife beendet wird. Da serverSocket.accept() aber blockiert, wird die Bedingung für die Schleife jedoch nicht geprüft, bis eine Verbindung eingegangen ist und der Thread läuft einfach weiter. Wie kann ich also diese "Blockade" umgehen?

Schon mal danke im Vorraus.


----------



## Spacerat (12. Aug 2009)

Ich weiss nicht ob es in diesem Stadium des Sockets noch möglich ist, ein SocketTimeout zu setzen. So ein SocketTimeout sorgt dafür, das darauf nur eine bestimmte Zeit gelauscht wird. Normalerweise setzt man die Zeit aber vor "accept()".


----------



## sparrow (12. Aug 2009)

Man kann auch auf einen ServerSocket ein .close() durchführen, AFAIR.
Ich bin mir sicher das auch schon vor kurzem in einem Thread gezeigt zu haben, ich find es nur nicht mehr.

Edit: Gefunden! http://www.java-forum.org/539061-post5.html


----------



## MacMallow (12. Aug 2009)

Erst einmal danke für die antworten. Socket.close() schließt zwar den Socket, wirft mir aber folgende Exception:

java.net.SocketException: socket closed
	at java.net.PlainSocketImpl.socketAccept(Native Method)
	at java.net.PlainSocketImpl.accept(Unknown Source)
	at java.net.ServerSocket.implAccept(Unknown Source)
	at java.net.ServerSocket.accept(Unknown Source)
	at connection.ServerThread.run(ServerThread.java:31)

(in Zeile 31 befindet sich socket = serverSocket.accept()


----------



## FArt (12. Aug 2009)

ServerSocket (Java 2 Platform SE v1.4.2)



MacMallow hat gesagt.:


> Erst einmal danke für die antworten. Socket.close() schließt zwar den Socket, wirft mir aber folgende Exception:
> 
> java.net.SocketException: socket closed
> at java.net.PlainSocketImpl.socketAccept(Native Method)
> ...



Gut so, vergiss "while is listening"...


----------



## SlaterB (12. Aug 2009)

was heißt hier aber, ist doch ok,
wenn du die Exception nicht magst, kannst du sie abfangen und gegebenenfalls ignorieren, 
das try/ catch musst du ja eh schon schreiben


----------



## MacMallow (12. Aug 2009)

Sorry...mein Fehler. Funktioniert! Danke euch allen.


----------



## tuxedo (13. Aug 2009)

Das hier hätte ebenfalls geholfen:

ServerSocket (Java 2 Platform SE v1.4.2)

Aber auch hier gibts ne Exception beim accept() und man brauch noch ne zusätzliche Schleife um das accept() drum rum. 

- Alex


----------



## Illuvatar (13. Aug 2009)

Eine Alternative wäre nio zu verwenden. Da kann der Vorgang dann einfach mit Thread#interrupt abgebrochen werden.

Ich hab das grad eben mal für mich ausprobiert, dabei ist bisschen Code entstanden. Vielleicht hilfts dir ja was 

```
import java.net.*;
import java.nio.channels.*;

public abstract class TestServerSocket implements Runnable
{
  private static final TestServerSocket[] IMPLEMENTATIONS = new TestServerSocket[]
          {new TestServerSocketImpl1(), new TestServerSocketImpl2()};
          
  public static void main(String[] args)
  {
    for (TestServerSocket test : IMPLEMENTATIONS) {
      System.out.println("\n");
      System.out.println(test);
      try {
        test.init();
      } catch (Exception e) {
        e.printStackTrace();
        continue;
      }
      
      Thread thread = new Thread(test);
      thread.start();
      
      pause();
      
      System.out.println("Interrupting...");
      thread.interrupt();
      
      pause();
      
      System.out.println("Closing...");
      try {
        test.closeSocket();
      } catch (Exception e) {
        e.printStackTrace();
        continue;
      }
    }
  }

  private static void pause()
  {
    try {
      Thread.sleep(2500);
    } catch (InterruptedException e) {
      Thread.currentThread().interrupt();
    }
  }
  
  public abstract void init() throws Exception;
  public abstract void closeSocket() throws Exception;
}

class TestServerSocketImpl1 extends TestServerSocket
{
  private ServerSocket ss;
  private ServerSocketChannel ssc;
  
  public void init() throws Exception
  {
    ssc = ServerSocketChannel.open();
    ss = ssc.socket();
    ss.bind(new InetSocketAddress(12452));
  }
  
  public void run()
  {
    try {
      ssc.accept();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  
  public void closeSocket() throws Exception
  {
    ss.close();
  }
}


class TestServerSocketImpl2 extends TestServerSocket
{
  private ServerSocket ss;
  
  public void init() throws Exception
  {
      ss = new ServerSocket(12453);
  }

  public void run()
  {
    try {
      ss.accept();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void closeSocket() throws Exception
  {
    ss.close();
  }
}
```


----------

