Исключение java.net.SocketException: Сокет закрыт в Android

#android #kotlin #unzip #socketexception #zipinputstream

Вопрос:

Я сталкиваюсь с исключением SocketException при распаковке файла, который получает с сервера. Я использовал ZipInputStream для извлечения файла из папки Zip, но я не знаю, почему я получаю исключение сокета. Согласно другому ответу на этот вопрос, я также попытался закрыть поток.

Фрагмент кода:

 private fun getImageFromAPI(item: MetaDataEntity, action: (ImagesEntity) -> Unit) {
        GlobalScope.launch(dispatcherProvider.io()) {
            dataHandler.adminRequestHandler.getAdminZipImage(item.uuid) { responseZip: Response ->
                val inputStream: InputStream = responseZip.body()!!.byteStream()
                val zin = ZipInputStream(inputStream)
                var ze: ZipEntry?
                GlobalScope.launch(dispatcherProvider.io()) {
                    while (zin.nextEntry.also { ze = it } != null) { //in this line getting socket exception
                        ze?.let {
                            if (validateImageName(it.name)) {
                                val imageByteArray: ByteArray = zin.readBytes()
                                action(ImagesEntity(item.uuid, item.name, it.name.substring(0, 3), imageByteArray))
                                zin.closeEntry()
                                zin.close()
                            }
                        }
                    }
                }
            }
        }
    }
 

Журнал ошибок:

 021-10-06 00:06:47.845 5903-6064/E/AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-7
    Process:  PID: 5903
    java.net.SocketException: Socket closed
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:119)
        at java.net.SocketInputStream.read(SocketInputStream.java:176)
        at java.net.SocketInputStream.read(SocketInputStream.java:144)
        at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.readFromSocket(ConscryptEngineSocket.java:936)
        at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.processDataFromSocket(ConscryptEngineSocket.java:900)
        at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.readUntilDataAvailable(ConscryptEngineSocket.java:815)
        at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.read(ConscryptEngineSocket.java:788)
        at okio.Okio$2.read(Okio.java:140)
        at okio.AsyncTimeout$2.read(AsyncTimeout.java:237)
        at okio.RealBufferedSource.read(RealBufferedSource.java:51)
        at okhttp3.internal.http1.Http1Codec$AbstractSource.read(Http1Codec.java:363)
        at okhttp3.internal.http1.Http1Codec$FixedLengthSource.read(Http1Codec.java:407)
        at okio.RealBufferedSource$1.read(RealBufferedSource.java:447)
        at java.io.FilterInputStream.read(FilterInputStream.java:133)
        at java.io.PushbackInputStream.read(PushbackInputStream.java:186)
        at java.util.zip.ZipInputStream.read(ZipInputStream.java:230)
        at java.util.zip.ZipInputStream.closeEntry(ZipInputStream.java:147)
        at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:120)
        at de.iteratec.mywork.cache.repos.AdminRepo$getImageFromAPI$1$1$1.invokeSuspend(AdminRepo.kt:106)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
        at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:738)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
 

Пожалуйста, помогите мне разобраться, где я ошибаюсь. Любая помощь будет признательна.

Комментарии:

1. Происходит ли то же самое, если вы отделяете загрузку от распаковки? То есть, загрузите файл полностью, либо в память, либо в локальное хранилище, а затем распакуйте его?

2. @solarshado Я не пробовал этот вариант, например, сначала сохранить, а затем попытаться распаковать…позвольте мне попробовать ваше решение. Спасибо

3. @solarshado попробовал ваше предложение, но все равно получил ту же проблему