Wifi-Direct文件传输客户端未接收到整个文件

问题描述 投票:0回答:1

我无法使用WiFi-Direct传输整个文件。文件发送者指示整个文件已复制到套接字输出流。文件接收器仅接收大约一半的文件。

我查看了原始文件的内容和存储接收到的数据的文件的内容,发现接收方只接收原始文件的片段。例如,它将接收字节0-100,然后将其跳转到字节245-350。

为什么接收方只接收文件的一部分而不是整个文件?

文件接收逻辑

    private class FileReceiveThread(val channel: Channel) : TransmissionThread() {
        private var mFileName: String = ""
        private var mFileSize: Long = 0L
        private var mBytesReceivedTotal = 0L

        override fun run() {
            try {
                Timber.d("File receive thread running: fileSize=$mFileSize, fileName=$mFileName")
                val outputFile = File.createTempFile("file", "")
                val fileOutput = outputFile.outputStream()
                val channelInput = DataInputStream(channel.getInputStream().unwrap())

                val inputBuffer = mutableListOf<Byte>()
                var numBytesRemaining = mFileSize

                while (mBytesReceivedTotal < mFileSize) {
                    val buffer = ByteArray(FILE_TX_BUFFER_SIZE)
                    var bytesCopiedTotal = 0L
                    channelInput.readFully(buffer)
                    inputBuffer.addAll(buffer.toTypedArray())
                    bytesCopiedTotal += FILE_TX_BUFFER_SIZE

                    mBytesReceivedTotal += bytesCopiedTotal
                    Timber.v("Bytes received total: $mBytesReceivedTotal")

                    fileOutput.write(inputBuffer.toByteArray())

                    inputBuffer.clear()
                }

                onTransmitComplete?.invoke()
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }

        fun start(filename: String, size: Long) {
            mFileName = filename
            mFileSize = size
            start()
        }
    }

文件发送逻辑

    private class FileSendThread : TransmissionThread() {
        var mFile: File? = null
        var mOutputStream: OutputStream? = null

        override fun run() {
            if (mFile != null && mOutputStream != null) {
                Timber.i("Copying file input stream to output stream")
                val inputStream = mFile!!.inputStream()
                val channelStream = mOutputStream!!
                val buffer = ByteArray(FILE_TX_BUFFER_SIZE)

                while (inputStream.read(buffer) > 0) {
                    channelStream.write(buffer)
                }

                Timber.d("Wrote file to output stream")

                inputStream.close()

                Timber.d("No more data to send")
                onTransmitComplete?.invoke()
            } else Timber.d("Parameters null: file=$mFile")
        }

        fun start(file: File, stream: OutputStream) {
            mFile = file
            mOutputStream = stream
            start()
        }
    }
android sockets file-transfer
1个回答
0
投票
           while (inputStream.read(buffer) > 0) {
                channelStream.write(buffer)
            }

read()通常不会填充整个缓冲区。因此,如果您编写缓冲区,则仅在缓冲区被填充为止。

           var totalbytesread = 0;
           var nread;
           while ((nread = inputStream.read(buffer)) > 0) {
                channelStream.write(buffer, 0, nread)
                totalbytesread += nread;
            }

           channelStream.close()';

记录已读取的总字节数。您的原始代码会导致收到的文件更大,因此还有其他发现。.

© www.soinside.com 2019 - 2024. All rights reserved.