【问题标题】:Socket programming in android - Reading bytes from input stream is very slow over Wifiandroid中的套接字编程-通过Wifi从输入流中读取字节非常慢
【发布时间】: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


【解决方案1】:

在寻找了几天的解决方案并尝试了多种方法来提高在 inputstream 上调用 read 时的速度后,我终于找到了解决方案。

感谢 cmets 的 Gerd,他帮助我开始思考 Wifi 连接的强度。

我发现,如果您使用 Android Wifi Manager 连接到 wifi,则建立的连接速度很慢,如果您连接到实际的 wifi,您甚至不会在任务栏中看到。

为了克服它,我使用手机中的 Wifi 设置手动连接到热点,并且速度更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多