Как обнаружить ближайший боковой разъем?

Как вы обнаруживаете, что Socket#close() был вызван в сокете на удаленной стороне?

Метод isConnected не поможет, он вернет true даже если удаленная сторона закрыла сокет. Попробуй это:

 public class MyServer { public static final int PORT = 12345; public static void main(String[] args) throws IOException, InterruptedException { ServerSocket ss = ServerSocketFactory.getDefault().createServerSocket(PORT); Socket s = ss.accept(); Thread.sleep(5000); ss.close(); s.close(); } } public class MyClient { public static void main(String[] args) throws IOException, InterruptedException { Socket s = SocketFactory.getDefault().createSocket("localhost", MyServer.PORT); System.out.println(" connected: " + s.isConnected()); Thread.sleep(10000); System.out.println(" connected: " + s.isConnected()); } } 

Запустите сервер, запустите клиент. Вы увидите, что он дважды печатает «connected: true», хотя сокет закрывается второй раз.

Единственный способ узнать это – это прочитать (вы получите -1 в качестве возвращаемого значения) или запись (будет IOException (сломанный канал)) на соответствующие Input / OutputStreams.

Поскольку ответы отклоняются, я решил проверить это и опубликовать результат, включая пример теста.

Сервер здесь просто записывает данные клиенту и не ожидает ввода.

Сервер:

 ServerSocket serverSocket = new ServerSocket(4444); Socket clientSocket = serverSocket.accept(); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); while (true) { out.println("output"); if (out.checkError()) System.out.println("ERROR writing data to socket !!!"); System.out.println(clientSocket.isConnected()); System.out.println(clientSocket.getInputStream().read()); // thread sleep ... // break condition , close sockets and the like ... } 
  • clientSocket.isConnected () возвращает всегда true, как только клиент подключается (и даже после отключения) странно !!
  • getInputStream (). чтения ()
    • заставляет stream ждать ввода до тех пор, пока клиент подключен, и поэтому ваша программа ничего не делает – за исключением случаев, когда вы получаете какой-либо ввод
    • возвращает -1, если клиент отключен
  • out.checkError () является истинным, как только клиент отключается, поэтому я рекомендую это

Вы также можете проверить ошибку выходного streamа сокета во время записи в клиентский сокет.

 out.println(output); if(out.checkError()) { throw new Exception("Error transmitting data."); } 

Метод Socket.Available немедленно выбросит SocketException, если удаленная система отключила / закрыла соединение.

  • java.net.SocketException: Недопустимый аргумент: connect
  • Правильное закрытие SSLSocket
  • Что представляет собой самый большой размер безопасного пакета UDP в Интернете?
  • Как работает функция accept API ()?
  • сокет программирует несколько клиентов на один сервер
  • Как вы дросселируете пропускную способность соединения сокета в C?
  • Несколько клиентов асинхронного сервера
  • Передача изображения OpenCV на C ++ через сокет
  • Параметр TCP SO_LINGER (ноль) - когда требуется
  • Официальные причины для «Программного обеспечения прерывания соединения: ошибка записи сокета»
  • Единство: streamовое видео в реальном времени
  • Interesting Posts

    Как сделать все приложения запустимыми в качестве администратора в Windows 10?

    Как я могу сортировать два вектора одинаково, с критериями, которые используют только один из векторов?

    Найти следующий TCP-порт в .Net

    Альтернатива itoa () для преобразования целого в строку C ++?

    Как передать объект в список общего типа в F #

    Создание пользовательского расширения файла с реестром Windows

    Как использовать class в Java?

    Эффективный алгоритм конкатенации строк с перекрытием

    Есть ли пример использования TouchDelegate в Android для увеличения размера цели клика?

    Проблема с генераторами Java: ошибка classа «не в пределах ограничений типа».

    Select2 не работает, если он встроен в загрузочный модальный

    Статический блок против блока инициализации в Java?

    Исключение без трассировки стека в Java

    JNI и Gradle в Android Studio

    Внешний жесткий диск всегда используется при попытке безопасного удаления

    Давайте будем гением компьютера.