【发布时间】:2020-07-17 13:59:46
【问题描述】:
我在我的 Android 应用程序中使用 Sockets 通过 Wifi 传输数据,我已将缓冲区大小设置为 10MB 左右,这是我用于发送数据的代码。
// Sending data from a file in chunks, PREFERRED_CHUNK_SIZE is [1024 * 1024 * 10]
var fileSize = fileList[index].totalSize
val buffer = ByteArray(SocketConstants.PREFERRED_CHUNK_SIZE)
var length: Int
do {
length = stream.read(buffer, 0, min(buffer.size, fileSize))
bos.write(buffer, 0, length)
fileSize -= length
} while (fileSize != 0)
stream.close()
我正在为多个文件传输重用相同的代码,条件文件大小!= 0 确保我只读取单个文件的那么多字节,因此我使用了 min 函数假设我想发送 36 MB 它是以 10(10485760 字节)、10(10485760 字节)、10(10,485,760 字节)、6 发送。
以下是我的接收器代码:
var fileSize = file.totalSize
var current: Int
var offset = 0
val byteArray = ByteArray(SocketConstants.PREFERRED_CHUNK_SIZE)
val bufferedInputStream = BufferedInputStream(inputStream)
do {
current = bufferedInputStream.read(byteArray, 0, min(byteArray.size, fileSize))
// outputStream.write(byteArray, 0, current) To ignore file write for now
fileSize -= current
offset += current
println("Length: $current")
file.bytesDownloaded = offset
updateList(offset)
} while (fileSize != 0)
outputStream.flush()
outputStream.close()
阅读时,我得到了非常小的字节块,1358、1358、1358、1358、1358。
这真的很慢,我不明白是什么导致 inputStream.read() 读取这么小。
我已经为 SocketServer 和 Socket 实例设置了发送者和接收者缓冲区的大小。但是结果没有区别
【问题讨论】:
-
那个缓冲区大得离谱。 8192应该够了。
-
是 tcp/ip 决定块大小。
-
您是在两台 Android 设备之间传输吗?
-
是的,我正在两台 Android 设备之间进行传输。你认为缓冲区会导致它变慢吗?
-
您可以查看 Wifi 连接的 MTU(最大传输单元)。 - 您也可以尝试在“普通”Java 程序中使用此代码(如果适用)并通过 Wifi 和以太网传输数据,看看是否有任何区别。
标签: java android sockets kotlin serversocket