2012-03-18 3 views
1

Im создает клиентскую программу сервера, где клиент отправляет определенную информацию на сервер и получает ответ от сервера. Для непрерывного прослушивания нескольких клиентов у меня есть поток на сервере, который постоянно прослушивает запрос клиента. всякий раз, когда запрос получен, я запускаю другой поток и отправляю этот сокет для запуска и запуска прослушивания запроса других клиентов.Killing thread in java

здесь код для непрерывного прослушивания

while(true){ 
    //serverListener is a ServerSocket object 
    clientSocket = serverListener.accept();//Waiting for any client request 

    //New thread started when request is received from any client 
    Thread thread =new Thread(new serverThread(clientSocket), "ClientThread"); 
    thread.start(); 
} 

Теперь моя проблема заключается в том, что, как я могу остановить сервер. Я знаю одну альтернативу использования переменной boo lean во время цикла, а затем изменение значения, но проблема заключается в том, когда поток ожидает ожидания какого-либо соединения в это время изменение значения логической переменной также не остановит сервер.

Есть ли способ решить эту проблему.

+0

1 решение, которое я нашел, что использование тайм-аут для сокета сервера, а затем с использованием логической переменной, которая проверяет, остановлен ли сервер или нет. – Zlatan

ответ

0

ServerSocket # setSoTimeout() может вас заинтересовать, который откажется принять, если таймаут был достигнут. Имейте в виду уловить исключение SocketTimeoutException.

+0

тайм-аут может быть одним из решений, но я не хочу останавливать его от прослушивания. – Zlatan

+1

Вы можете поместить accept() в цикл. Когда тайм-аут проверяет, была ли запрошена остановка. if not, accept() снова. – PeterMmm

3

Обычно serverListener (что я предполагаю на самом деле ServerSocket или что-то еще) закрывается другой веткой. Это создаст java.net.SocketException в accept(), который завершит цикл и поток.

final ServerSocket serverSocket = new ServerSocket(8000); 
new Thread(new Runnable() { 
    public void run() { 
     while (true) { 
      try { 
       serverSocket.accept(); 
      } catch (IOException e) { 
       return; 
      } 
     } 
    } 
}).start(); 
Thread.sleep(10000); 
serverSocket.close(); 
+0

Я пробовал этот подход, и исключение IO все еще запущено. – Zlatan

+0

@Meherzad Что означает «все еще сервер работает»? Сокет не должен быть привязан к порту после его закрытия. Вы имеете в виду, что поток все еще работает? Программа не отключается? – Gray

+0

Попробуйте установить setDaemon (true). Вызовите его на сервере, чтобы принять поток перед его запуском. Потоки клиент-сервер будут также потоками демона. Затем приложение сервера должно выйти. –

0
volatile boolean finishFlag = false; 

while(true){ 

      clientSocket = serverListener.accept();//Waiting for any client request 

      if (finishFlag) 
       break; 

      //New thread started when request is received from any client 
      Thread thread =new Thread(new serverThread(clientSocket), "ClientThread"); 
      thread.start(); 
} 

EDIT:

для прерывания слушателя, вы должны остановить этот поток снаружи, а затем принять() будут броски IOException

try { 
     while (true) { 
     Socket connection = server.accept(); 

     try {  
      // any work here  
      connection.close(); 
     } 
     catch (IOException ex) { 
     // maybe the client broke the connection early. 
     } 

     finally { 
     // Guarantee that sockets are closed when complete. 
     try { 
      if (connection != null) connection.close(); 
     } 
     catch (IOException ex) {} 
    }  
    }  
    catch (IOException ex) { 
    System.err.println(ex); 
    } 
+0

он продолжает ждать при принятии(), пока клиентский запрос не будет получен, когда новый клиент будет принят, и только он перейдет к следующей строке. Я пробовал это дело и также упомянул об этом в вопросе. – Zlatan