2015-02-12 2 views
1

У меня проблемы с Java-сокетами. У меня есть пара приложений, которые устанавливают связь между ними (один открывается ServerSocket, вызывает accept() и ждет, и другие подключаются через Socket(InetAddress,int) конструктора.Detect Socket закрывается после принудительного закрытия приложения.

После установления соединения, сокет Thread создается с этим Runnable.

public void run() {  
    System.out.print("Watching Socket for closing "); 
    while(running) { 
     if(socket.isClosed()) { 
      System.out.println("Socket has been closed"); 
      break; 
     } 
    } 
    this.running = false; 
    //safely ends this application by closing i/o and exiting. 
} 

Моя проблема заключается в том, что, когда один из приложений неожиданно закрыто (в моем случае прекращено из Затмения), призывающую Socket.isClosed() все еще показывает сокет открыт, и поэтому цикл продолжает работать, как если сокет был открыт .

Как определить, когда сокет закрыт, когда приложение Java с другой стороны принудительно завершено?

+0

Получаете ли вы IOException во время чтения? – ucsunil

+0

Нет, я еще не добавил ничего, что читает и пишет. –

ответ

5

Единственный способ, которым socket.isClosed() return true is, если вы называете себя socket.close(), так как это единственная часть, где значение boolean будет установлено равным true.

Что вы можете сделать, просто попробуйте прочитать с socket с использованием inputStream, и -1 будет возвращен, если он будет закрыт (если конец потока достигнут).

Для получения дополнительной информации см. documentation.

+0

@ LukeMoll любая обратная связь по этому вопросу? –

+0

Извините, я был вдали от своего компьютера. Будет ли чтение из 'InputStream', когда соединение закрывается, мгновенно возвращает -1, но когда есть соединение, но нет данных, он будет блокироваться до тех пор, пока не будет? Также было бы выброшено 'IOException'? У меня не было возможности прочитать JavaDoc, поэтому я извиняюсь, если все это есть. –

+0

@ LukeMoll Да, он мгновенно вернет -1. Да, он будет блокироваться до следующего байта. Нет, никаких исключений не было. Честно говоря, так оно и должно быть сделано. Если у вас проблемы с блокировкой, вам нужно рассмотреть многопоточность. –

Смежные вопросы