如何在okHttp3 webscocket android上修复我的错误? [英] How to fix my errors at okHttp3 webscocket android?
问题描述
我在网络套接字上收到这样的错误:
I receive such error at my websocket:
Error: [okio.RealBufferedSource.require(RealBufferedSource.kt:201), okio.RealBufferedSource.readByte(RealBufferedSource.kt:210), okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:119), okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:102), okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:293), okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:195), okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:504), java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162), java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636), java.lang.Thread.run(Thread.java:764)]
当我尝试将分块的字符串文件发送到服务器时会发生这种情况.例如,当我发送大小为14B的字符串文件时,一切正常,但是当我发送最大为10kB的文件时,会收到此类错误.当我尝试发送分块的120kB文件时,出现以下错误:
It happens when I try to send chunked string files to server. For example when I send file in string with size 14B everything goes well, but when I send file up to 10kB I receive such error. When I try to send chunked 120kB file I receive such error:
Error: [okio.RealBufferedSource.require(RealBufferedSource.kt:201), okio.RealBufferedSource.readByte(RealBufferedSource.kt:210), okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:119), okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:102), okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:293), okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:195), okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:504), java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162), java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636), java.lang.Thread.run(Thread.java:764)]
我发送文件的地方:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when {
requestCode == 1 && resultCode == Activity.RESULT_OK -> {
if (data != null) {
val fileUri = data.data!!
val partSize = 10000
val fileString = readTextFile(fileUri)
var name = ""
var size: Long? = null
fileUri.let { returnUri ->
contentResolver.query(returnUri, null, null, null, null)
}?.use { cursor ->
val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE)
cursor.moveToFirst()
name = cursor.getString(nameIndex)
size = cursor.getLong(sizeIndex)
}
if (size!! <= partSize) {
ws.send(ChatRequestMessages.sendFile(fileString!!,
name,
selectedContactId.toString(),
size!!,
0))
} else {
val partsCount = if (size!!.rem(partSize).toInt() == 0) {
size!!.div(partSize)
} else {
size!!.div(partSize)
}
for (currentPart in 0..size!!.div(partSize)) {
val slicedString = if ((currentPart + 1) * partSize <= size!!.toInt()) {
fileString!!.substring(currentPart.toInt() * partSize..(currentPart + 1).toInt() * partSize)
} else {
fileString!!.substring(currentPart.toInt() * partSize until fileString.length)
}
Timber.i("${fileString.length.toLong()} ${currentPart * partSize} ${slicedString.length} $slicedString $name")
ws.send(ChatRequestMessages.sendFile(slicedString,
name,
selectedContactId.toString(),
fileString.length.toLong(),
(currentPart * partSize).toInt()))
}
}
}
}
}
我不明白为什么小文件不会出现这种错误,以及如何解决这些错误:(
I don't understand why it doesn't happen with small files and how to solve these errors :(
推荐答案
它看起来像是一个空的响应. RealBufferedSource.require
中的javadoc说,当缓冲区至少包含byteCount
个字节时返回.抛出一个
[java.io.EOFException]如果在读取所需字节之前已用尽源代码.
okhttp.internal.ws.WebSocketReader
尝试从响应中读取第一个字节,但没有得到它.
It looks like an empty response. The javadoc from RealBufferedSource.require
says Returns when the buffer contains at least byteCount
bytes. Throws an
[java.io.EOFException] if the source is exhausted before the required bytes can be read.
okhttp.internal.ws.WebSocketReader
tries to read the first byte from the response, but doesn't get it.
这篇关于如何在okHttp3 webscocket android上修复我的错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!