2010-05-10 12 views
8

następujący kod jest kod serwera w mojej aplikacji:Wątek Java Server Zatrzymaj

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); 
     } 
    } 
} 

Kod rodzaju działa to znaczy, jeśli im prostą próbą połączenia oba końce komunikowania i aktualizacji.

Problem polega na tym, że próbuję odsłuchać połączenie, jeśli chcę zakończyć odsłuchiwanie, a wątek serwera nadal działa i powoduje problemy.

Wiem, że nie powinienem używać .stop() w wątku, więc zastanawiałem się, jak mogłoby wyglądać rozwiązanie w tym przypadku?

EDYCJA: skomentował niepotrzebny kod.

Odpowiedz

12

Zamknij gniazdo serwera z zewnętrznego wątku. Zgodnie z dokumentacją na Serversocket.close() akceptacja blokowania rzuci wyjątek SocketException i możesz zamknąć wątek.

6

Po zainicjowaniu swojego ServerSocket użyj setSoTimeout. Ustaw akceptację w pętli, łapiąc limity czasu. Przerwij z pętli i wróć z run w zależności od tego, czy chcesz kontynuować, czy nie.

+0

Dziękuję bardzo za "Break from the loop" - to jest klucz! – Kirzilla