Как я могу прервать ServerSocket, принимают () метод?

В моем основном потоке у меня есть a while(listening) цикл, который звонит accept() на моем объекте ServerSocket, затем запускает новый клиентский поток и добавляет его к Набору, когда новый клиент принят.

Я также сделал, чтобы Администратор распараллелил, который я хочу использовать для выдачи команд, как 'выход', который заставит все клиентские потоки быть закрытыми, завершает работу себя и закрывает основной поток путем превращения слушания лжи.

Однако accept() призовите while(listening) блоки цикла, и там, кажется, не способ прервать его, таким образом, в то время как условие не может быть проверено снова и программа не может выйти!

Существует ли лучший способ сделать это? Или некоторый способ прервать метод блокирования?

136
задан Glorfindel 23 May 2017 в 07:36
поделиться

3 ответа

Вы можете вызвать close () из другого потока, и вызов accept () вызовет исключение SocketException .

144
ответ дан 23 November 2019 в 23:40
поделиться

Установите таймаут на accept(), тогда вызов отключит блокировку через указанное время:

http://docs.oracle.com/javase/7/docs/api/java/net/SocketOptions.html#SO_TIMEOUT

Установите таймаут на блокировку Socket операций:

ServerSocket.accept();
SocketInputStream.read();
DatagramSocket.receive();

Опция должна быть установлена до ввода блокирующей операции, чтобы она вступила в силу. Если таймаут истекает, а операция продолжает блокироваться, java.io.InterruptedIOException будет поднят. Сокет Socket в этом случае не закрывается.

27
ответ дан 23 November 2019 в 23:40
поделиться

Вызов close () в ServerSocket как вариант?

http: / /java.sun.com/j2se/6/docs/api/java/net/ServerSocket.html#close%28%29

Закрывает этот сокет. Любой поток, заблокированный в настоящее время в accept (), вызовет SocketException.

9
ответ дан 23 November 2019 в 23:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: