簡體   English   中英

Android 插座 TCP 數據丟失

[英]Android Socket TCP Dataloss

我無法使用 WiFi-Direct 傳輸整個文件。 文件發送者指示整個文件已被復制到套接字 output stream。 文件接收器只接收大約一半的文件。

我查看了原始文件的內容和存儲接收數據的文件的內容,發現接收方只接收原始文件的片段。 例如,它將接收字節 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 = channel.getInputStream().unwrap()

                val inputBuffer = ByteArray(FILE_TX_BUFFER_SIZE)
                var bytesReceived = channelInput.read(inputBuffer)

                while (bytesReceived > 0) {
                    fileOutput.write(inputBuffer)
                    mBytesReceivedTotal += bytesReceived
                    Timber.d("Received $mBytesReceivedTotal total bytes")
                    bytesReceived = channelInput.read(inputBuffer)
                }

                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) {
                val inputStream = mFile!!.inputStream()
                val channelStream = mOutputStream!!
                val buffer = ByteArray(FILE_TX_BUFFER_SIZE)

                var bytesRead = inputStream.read(buffer)
                var totalBytesRead = 0L + bytesRead

                while (bytesRead > 0) {
                    Timber.v("Read $bytesRead, total $totalBytesRead")
                    channelStream.write(buffer)
                    bytesRead = inputStream.read(buffer)
                    totalBytesRead += bytesRead
                }

                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()
        }
    }
           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()';

記錄讀取的總字節數。 您的原始代碼會導致接收到的文件更大,因此還有其他內容需要發現..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM