Вообще говоря, вы не выключаете сервер, потому что клиент сказал пока.Это означает, что любой пользователь может подключиться к вашему серверу и удаленно отключиться без вашего контроля.Завершение работы сервера выполняется администратором или владельцем сервера, и обычно выполняется путем запуска команды на сервере через сеанс аутентификации ssh.В Unix / Linux вы можете запустить:
service chatserver stop
Это еще одна тема, как заставить это работать, но только для того, чтобы дать вам общий обзор лучших практик.Теперь, если вы хотите выключить клиент, когда разговор окончен.Это имеет больше смысла:
public class ChatServerThread implements Runnable {
.......
public void run() {
try {
handleClient();
} catch( EOFException eof ) {
System.out.println("Client closed the connection.");
} catch( IOException ioe ) {
ioe.printStacktrace();
}
}
public void handleClient() throws IOException {
boolean done = false;
try {
while(!done) {
String nextCommand = streamIn.readUTF();
if( nextCommand.equals(".bye") ) {
done = true;
} else {
System.out.println( nextCommand );
}
}
} finally {
streamIn.close();
streamOut.close();
socket.close();
}
}
}
Затем вы можете освободить этот поток для обслуживания следующего клиента или просто закрыть его.С DataInputStream вы получите EOFException, когда клиент закроет сокет без отправки «.bye».Таким образом, вы можете перехватить EOFException до IOException и просто завершить работу.
Обратите внимание, что я не создал подкласс Thread.Вместо этого я реализовал Runnable, который дает вам больше гибкости в будущем, если вы захотите создать пул потоков или что-то более изворотливое.