Я изучаю использование ServerSocket
и получаю сообщение об ошибке при попытке закрыть объект serverSocket
, пока работает метод accept()
. Затем я нашел решение с помощью метода setSoTimeout()
. Но я думаю, что игнорировать исключение - не лучшая практика. Итак, вот мои два класса:
класс Сервер:
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
раз в секунду)? Любые рекомендации приветствуются