2010-05-10 16 views
8

der folgende Code ist Code-Server in meiner App:Java Stop Server Thema

private int serverPort; 

private Thread serverThread = null; 

public void networkListen(int port){ 

    serverPort = port; 

    if (serverThread == null){ 
     Runnable serverRunnable = new ServerRunnable(); 
     serverThread = new Thread(serverRunnable); 
     serverThread.start(); 
    } else { 

    } 
} 

public class ServerRunnable implements Runnable { 

    public void run(){ 

     try { 

      //networkConnected = false; 
      //netMessage = "Listening for Connection"; 
      //networkMessage = new NetworkMessage(networkConnected, netMessage); 
      //setChanged(); 
      //notifyObservers(networkMessage); 

      ServerSocket serverSocket = new ServerSocket(serverPort, backlog); 

      commSocket = serverSocket.accept(); 

      serverSocket.close(); 
      serverSocket = null; 

      //networkConnected = true; 
      //netMessage = "Connected: " + commSocket.getInetAddress().getHostAddress() + ":" + 
        //commSocket.getPort(); 
      //networkMessage = new NetworkMessage(networkConnected, netMessage); 
      //setChanged(); 
      //notifyObservers(networkMessage); 

     } catch (IOException e){ 

      //networkConnected = false; 
      //netMessage = "ServerRunnable Network Unavailable"; 
      //System.out.println(e.getMessage()); 
      //networkMessage = new NetworkMessage(networkConnected, netMessage); 
      //setChanged(); 
      //notifyObservers(networkMessage); 
     } 
    } 
} 

Der Code Art arbeitet das heißt, wenn im einen geraden Verbindung versuchen, beide Enden kommunizieren und zu aktualisieren.

Das Problem ist, während ich auf eine Verbindung höre, wenn ich hören will, dann läuft der Server-Thread weiter und verursacht Probleme.

ich weiß, dass ich .stop() auf einem Thread nicht verwenden sollte, also fragte ich mich, wie die Lösung in diesem Sinne aussehen würde?

BEARBEITEN: nicht benötigten Code auskommentiert.

Antwort

12

Schließen Sie den Server-Socket von einem externen Thread. Wie in der Dokumentation unter Serversocket.close() wird das Blockieren akzeptieren eine SocketException werfen und Sie können Ihren Thread herunterfahren.

6

Verwenden Sie nach der Initialisierung Ihres ServerSockets setSoTimeout. Setzen Sie das Akzeptieren in eine Schleife und fangen Sie die Timeouts ab. Brechen Sie die Schleife ab und kehren Sie von run zurück, je nachdem, ob Sie fortfahren möchten oder nicht.

+0

Vielen Dank für "Break from the Loop" - es ist der Schlüssel! – Kirzilla