Java Android套接字TCP数据丢失

Java Android套接字TCP数据丢失,java,android,sockets,tcp,ftp,Java,Android,Sockets,Tcp,Ftp,我无法使用WiFi直接传输整个文件。文件发送方指示整个文件已复制到套接字输出流。文件接收者只接收大约一半的文件 我查看了原始文件的内容和存储接收数据的文件的内容,发现接收者只接收原始文件的一部分。例如,它将接收字节0-100,然后跳转到字节245-350 为什么接收器只接收文件的比特和片段,而不是整个文件? 文件接收逻辑 文件发送逻辑 read()通常不会填充整个缓冲区。因此,如果您写入缓冲区,则仅当缓冲区已填满时才写入 var totalbytesread = 0;

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

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

为什么接收器只接收文件的比特和片段,而不是整个文件?

文件接收逻辑 文件发送逻辑 read()通常不会填充整个缓冲区。因此,如果您写入缓冲区,则仅当缓冲区已填满时才写入

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

           channelStream.close()';
记录totalbytesread。
您的原始代码会导致接收到更大的文件,因此会发现其他内容。

while(mBytesReceivedTotal
正手时的接收者如何知道文件的大小?非常奇怪。缺少:
fileOutput.close()
Timber.v(“收到的字节总数:$mBytesReceivedTotal”)
它打印了什么?
mFileSize
在线程外部接收,并传入。请参阅FileSendThread的底部<代码>文件输出在其他位置关闭。对于接收到的字节记录,它只打印接收到的字节数。它始终大约是总文件大小的一半。指示接收器仅接收文件的一半。
mFileSize在线程外部接收,
无法回答我的问题。重复:
正手击球的接球手如何知道球的大小。我收到的不是更大的文件,而是更小的文件。收到的文件大约是正在发送的文件的一半。以下是用于接收的日志:。此外,以下是用于发送的日志:,注意:接收日志似乎被切断,但它们不是。
channelStream.write(buffer,0,nread)
这真的会写入
nread'字节吗?没有返回值吗
int nwrited=channelStream.write(缓冲区,0,nread)`?他们应该是平等的。检查。检查之前,它没有!对不起,我不知道你说的是什么意思。请准确。写入(b字节[])
函数不返回写入的字节数。它是返回类型
void
    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)
            }
           var totalbytesread = 0;
           var nread;
           while ((nread = inputStream.read(buffer)) > 0) {
                channelStream.write(buffer, 0, nread)
                totalbytesread += nread;
            }

           channelStream.close()';