How to fix my errors at okHttp3 webscocket android?

我怕爱的太早我们不能终老 提交于 2020-05-17 07:05:24

问题


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)]

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)]

Place where I send file:

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 :(


回答1:


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.



来源:https://stackoverflow.com/questions/61522264/how-to-fix-my-errors-at-okhttp3-webscocket-android

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!