【问题标题】:How to FAST transfer files from server to Android phone with Java?如何使用 Java 将文件从服务器快速传输到 Android 手机?
【发布时间】: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 通道是替代方案,但也可能不会更快)。 0read() 的合法价值,即使还有更多的东西要返回。我也会摆脱BufferedInputStream,因为您有自己的缓冲区,而另一个缓冲区无济于事。客户端代码长什么样子?
  • 手机是wifi还是蜂窝?如果在蜂窝网络上,这可能是意料之中的——您的限制因素是延迟,而不是吞吐量。在蜂窝网络上建立连接需要很长时间。
  • 另一个想法-您使用的是缓冲文件写入器,还是无缓冲的?如果没有缓冲,这可能是问题所在。尝试注释掉写入以将其限制为仅传输时间,隔离问题。
  • 我从未在蜂窝网络上测试过,只有无线网络。可能会更慢..
  • @GabeSechan 缓冲输出流无法做到这一点。它所做的只是收集数据直到它满了,然后它会write(byte[] bigChunk)。但这只是另一个任意大小的缓冲区,上面的代码已经相同了。 Java 流只是将数据推送到操作系统级别的缓存中,然后分批写入。缓冲流也不是异步的,因此系统不会从那里以适当的块获取数据。

标签: java android sockets server


【解决方案1】:

如果您希望您的 android 设备从服务器读取数据,最好使用 android AsynTask 并实现 doInBackground 方法。 这样,您可以使用 org.apache 库的 HttpClient 建立与服务器的连接,并发出请求并接收响应,您可以在其中从 inputStream 读取它。

public String doInBackground()
{
  DefaultHttpClient httpClient = new DefaultHttpClient();
  HttpGet httpGet = new HttpGet("www.yourserverip.com");
  HttpResponse response = httpClient.execute(httpGet);
  HttpEntity entity = response.getEntity();
  BufferReader reader = new BufferReader(new InputStreamReader(entity.getContent()));'
  while(reader.readLine!=null)
  {
    //Read Something    
    //read Your data  
  }
 /*Note this is just a basic use of httpClient*/
 /*Also if its a file you really might not use the bufferedReader*/
}

首先,我真的希望我能理解您的问题以及您真正想要实现的目标。

【讨论】:

  • 我知道如何从服务器读取。请参阅问题编辑。我只是觉得 5 MB 的 15 秒太慢了,我想知道我的方法是否不好,是否有什么办法可以让它更快。
  • 他说的是通过套接字传输数据,而不是 HTTP 请求。而且他不是在问如何在 Android 上做到这一点,而是在问为什么事情这么慢,这并没有真正解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
相关资源
最近更新 更多