Я изучаю использование 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
переменная один раз в секунду)? Любые рекомендации приветствуются
То есть именно то, что он уже делает. – EJP
Он задал вопрос: «Правильно ли это, чтобы закрыть ServerSocket?» Также я просто добавляю некоторые аргументы, чтобы сказать «Да, это»^_ ^ – Xephi