Вы не должны просто останавливать сервер. Процесс выключения может занять некоторое время, пока происходит очистка, поскольку необходимо обеспечить согласованность.
Представьте себе сервер базы данных, если вы просто выключите его во время выполнения транзакций, вы можете оставить его данные несогласованными. Вот почему обычно требуется некоторое время для выключения сервера.
- Вы должны сначала прекратить принимать новые
соединения на сервере.
- Тогда вы можете подождать
текущие рабочие потоки, чтобы закончить
их работа, а затем закройте
сервер и завершение работы официально.
- Или вы заставляете рабочие потоки
закрыть свои связи с
клиент (возможно, использующий что-то вроде
флага как предложено). Это может
подразумевает некоторую очистку, чтобы оставить данные
последовательный, например, возврат
трансакции или любые изменения
Вы сделали в файлах или в памяти.
Насколько я понимаю, закрытие соединений с клиентами на стороне сервера должно привести к тому, что клиенты получат EOF на своих сторонах.
[EDIT-1]
Я немного углубился в эту проблему, просто потому, что некоторое время не использовал сокеты и потому, что мне этот вопрос показался интересным. Я думаю, как уже было отмечено другими, единственный вариант - закрыть сокет, который, согласно полученным Javadocs, автоматически закроет входной и выходной потоки /
Если есть вероятность, что поток не заблокирован IO, но находится в состоянии ожидания или в спящем режиме, я думаю, что все же рекомендуется выполнить Thread.interrupt () для соответствующего рабочего потока данного сокета; потому что не может быть уверенности в блокировке состояния каждого потока.
public static class IOServerWorker implements Runnable{
private Socket socket;
public IOServerWorker(Socket socket){
this.socket = socket;
}
@Override
public void run() {
String line = null;
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while( (line = reader.readLine())!=null){
System.out.println(line);
}
reader.close();
}catch(IOException e){
//TODO: do cleanup here
//TODO: log | wrap | rethrow exception
}
}
}