2016-12-17 2 views
0

Я изучаю использование ServerSocket и получаю сообщение об ошибке при попытке закрыть объект serverSocket пока метод accept() работает. Затем я нашел решение с методом setSoTimeout(). Но я думаю, что игнорировать исключение - не лучшая практика. Итак, вот мои два класса:Правильный способ закрыть ServerSocket

класса Сервер:

public class Server { 
    public static final int PORT = 8777; 
    private ServerSocket serverSocket; 
    private boolean serverRuns; 

    Server() { 
     try { 
      serverSocket = new ServerSocket(PORT); 
      serverRuns = true; 

      (new Control(this)).start(); // Takes commands while working 
      while (serverRuns) { 
       try { 
        serverSocket.setSoTimeout(1000); 
        Socket clientSocket = serverSocket.accept(); 
       } 
       catch (SocketTimeoutException e) { 
        // cap 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     finally { 
      try { 
       serverSocket.close(); 
       System.out.println("Server stopped"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    public void stopServer() { 
     serverRuns = false; 
    } 
    public boolean isServerRuns() { 
     return serverRuns; 
    } 
    public static void main(String[] Args) { 
     Server s = new Server(); 
    } 
} 

класс управления:

public class Control extends Thread { 
    private Server activeServer; 

    private Control() {} 
    Control(Server activeServer) { 
     this.activeServer = activeServer; 
    } 
    @Override 
    public void run() { 
     Scanner keyboard = new Scanner(System.in); 

     while (activeServer.isServerRuns()) { 
      String key = keyboard.nextLine().toLowerCase(); 

      switch (key) { 
       case "close": 
        activeServer.stopServer(); 
        break; 
      } 
     } 
    } 
} 

Правильно ли способ прекратить ServerSocket работу (игнорировать исключение и проверить serverRuns переменная один раз в секунду)? Любые рекомендации приветствуются

ответ

0

Вы должны вызвать сервер близко от другого потока, причина serverSocket.accept(); будет блокировать

Взгляните: Interrupt accept method and close the server

+0

То есть именно то, что он уже делает. – EJP

+0

Он задал вопрос: «Правильно ли это, чтобы закрыть ServerSocket?» Также я просто добавляю некоторые аргументы, чтобы сказать «Да, это»^_ ^ – Xephi