【发布时间】:2014-12-07 00:36:47
【问题描述】:
我正在构建一个需要从我们的服务器发送一些文件的 Android 应用。 Java的Server Socket和Android的socket客户端我都实现了,测试了一下,但是传输太慢了。
FILE SIZE: 5 MB
TRANSFER TIME: 15.3 seconds
所以服务器设置在我自己的 PC 上,我使用端口转发,因此我可以从任何网络连接到它。如果您认为相关,这里是我的网络的速度测试:http://www.speedtest.net/my-result/3965566858
现在是服务器代码:
BufferedInputStream musicData = new BufferedInputStream(new FileInputStream(new File("fileSrc")));
byte[] data = new byte[8192];
int count = 0;
while ((count = musicData.read(data)) > 0) {
outStreamMusic.write(data, 0, count);
}
客户端代码:
InputStream inStream = socketClient.getInputStream();
byte[] data = new byte[8192];
int count = 0;
while ((count = inStream.read(data)) > 0) {
tempFile.write(data, 0, count);
}
所以这将打开文件,解析它并发送字节,直到没有其他东西可以发送。我很确定这可以更快地完成,但我不知道如何。 Android 客户端只是打开一个到我的 ip/port 的套接字并从中读取数据。知道如何加快速度吗?
【问题讨论】:
-
您可以使用 8192,但仅此而已(nio 通道是替代方案,但也可能不会更快)。
0是read()的合法价值,即使还有更多的东西要返回。我也会摆脱BufferedInputStream,因为您有自己的缓冲区,而另一个缓冲区无济于事。客户端代码长什么样子? -
手机是wifi还是蜂窝?如果在蜂窝网络上,这可能是意料之中的——您的限制因素是延迟,而不是吞吐量。在蜂窝网络上建立连接需要很长时间。
-
另一个想法-您使用的是缓冲文件写入器,还是无缓冲的?如果没有缓冲,这可能是问题所在。尝试注释掉写入以将其限制为仅传输时间,隔离问题。
-
我从未在蜂窝网络上测试过,只有无线网络。可能会更慢..
-
@GabeSechan 缓冲输出流无法做到这一点。它所做的只是收集数据直到它满了,然后它会
write(byte[] bigChunk)。但这只是另一个任意大小的缓冲区,上面的代码已经相同了。 Java 流只是将数据推送到操作系统级别的缓存中,然后分批写入。缓冲流也不是异步的,因此系统不会从那里以适当的块获取数据。
标签: java android sockets server