Socket.getInputStream.read (...) создает исключение SocketException на Android, когда сервер отправляет пакет FIN - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь реализовать клиентское приложение для Android, которое подключается к серверу с помощью Socket, обменивается некоторыми данными, а затем корректно завершает соединение, как описано в этой статье:

https://docs.oracle.com/javase/8/docs/technotes/guides/net/articles/connection_release.html

Однако поведение клиентского сокета при отключении не ведет себя должным образом.

  1. Мы установили соединение между клиентом Android и сервером.

  2. Клиент заканчивает отправку всех данных и вызовов socket.shutdownOutput() (отправляет FIN на сервер).

  3. Сервер получает последние байты и вызывает его socket.shutdownOutput() (отправляет FIN клиенту).

  4. Клиент читает последние байты с сервера, а последний вызов socket.getInputStream().read(...) выдает следующее исключение:

    java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer) с указанием причины: android.system.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer)

Я ожидаю, что последний вызов socket.getInputStream().read(...) должен вернуть -1, что и происходит, когда я запускаю тот же код в OpenJDK 11 в Ubuntu.

Есть ли настройка Socket, которая могла бы исправить поведение на Android?

...