Почему установка «setChunkedStreamingMode» вызывает исключение Socket Exception?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Почему установка «setChunkedStreamingMode» вызывает исключение Socket Exception?

Сообщение Anonymous »

Я пытаюсь загрузить файл на сервер с помощью HttpUrlConnection.
AFAIU, передавая размер буфера в setChunkedStreamingMode, позволяет избежать нехватки памяти при передаче больших файлов через HttpUrlConnection. Источник моего вывода
Ниже я предоставил сокращенную версию своего кода, которая работает, пока setChunkedStreamingMode комментируется. Но раскомментирование setChunkedStreamingMode вызывает «Исключение сокета. Сломанный канал»
Я не уверен, правильно ли я его использую. Может ли кто-нибудь помочь мне, подсказав, как использовать setChunkedStreamingMode
Код:
try{
val dataStream = applicationContext.contentResolver.openInputStream(Uri.parse(fileUri))
val url = URL(urlString)
val httpConnection = url.openConnection() as HttpURLConnection
for (i in keys.indices) {
httpConnection.setRequestProperty(keys, values)
}

httpConnection.requestMethod = "POST"
httpConnection.doOutput = true

// setting the chunked mode. Causing Socket exception.
// httpConnection.setChunkedStreamingMode(DEFAULT_BUFFER_SIZE * 2)

val outPutStream = BufferedOutputStream(httpConnection.outputStream)

var bytesCopied: Long = 0
val buffer = ByteArray(DEFAULT_BUFFER_SIZE)
var bytes = dataStream.read(buffer)

while (bytes >= 0 && !isStopped) {
outPutStream.write(buffer, 0, bytes)
bytes = dataStream.read(buffer)
}
}
catch(ex){
print(ex) // Prints Socket exception "Broken pipe" if setChunkedStreamingMode is used
}


Исключение, возникающее при раскомментировании setChunkedStreamingMode
java.net.SocketOutputStream.socketWrite0(Native Method)
java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:116)
java.net.SocketOutputStream.write(SocketOutputStream.java:156)
com.android.org.conscrypt.ConscryptEngineSocket$SSLOutputStream.writeToSocket(ConscryptEngineSocket.java:762)
com.android.org.conscrypt.ConscryptEngineSocket$SSLOutputStream.writeInternal(ConscryptEngineSocket.java:736)
com.android.org.conscrypt.ConscryptEngineSocket$SSLOutputStream.write(ConscryptEngineSocket.java:699)
com.android.okhttp.okio.Okio$1.write(Okio.java:78)
com.android.okhttp.okio.AsyncTimeout$1.write(AsyncTimeout.java:157)
com.android.okhttp.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:177)
com.android.okhttp.okio.RealBufferedSink.write(RealBufferedSink.java:47)
com.android.okhttp.internal.http.Http1xStream$ChunkedSink.write(Http1xStream.java:327)
com.android.okhttp.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:177)
com.android.okhttp.okio.RealBufferedSink$1.write(RealBufferedSink.java:199)
java.io.BufferedOutputStream.write(BufferedOutputStream.java:123)
myapp(upload.kt:558)
myapp.invokeSuspend(Unknown Source:14)
kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)


Подробнее здесь: https://stackoverflow.com/questions/782 ... -exception
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»