-1

我正在使用套接字从一部 Android 手机和 PC 传输数据,我正在使用DataInputStream.

但是数据传输需要很长时间,传输一个 4 MB 的文件大约需要 10 分钟。

谁能提出更好的方法来做到这一点?

我对代码进行了一些更改,现在读取大约 1 Mb 的数据需要 15 秒。我想提高它的性能。我的代码是:

InputStream is= socket.getInputStream();
DataInputStream inChannel= new DataInputStream(new BufferedInputStream(in));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int oneByte;
while ((oneByte = inChannel.read()) != -1) {
        if (oneByte == 0) {
            break;
        }        
        baos.write(oneByte);
        byteCount++;
    }
byte[] inData = baos.toByteArray();
baos.close();
4

1 回答 1

-1

你确定你没有在它们之间发送空包或包做其他事情吗?如果您在数据包未到达其目的地的情况下使用 TCP(在路由器或其中一个设备上的连接之间的某处,缓冲区被其他数据包填满),则必须重新发送数据包。这可能是因为您的设置。鉴于您提供给我们的信息很少,我可以给出以下建议:

研究更高级的类型,我假设您没有使用这些类型中的任何一个:

一个发送一个接收线程;发送线程将您放入队列的数据包推出:


|P| - 数据包保存在程序的 Que 部分中

发送线程 <-| 磷 | 磷 | 磷 | <-应用程序/程序

回复 -> | 磷 | 磷 | 磷| P -> 应用程序/程序双端队列和分析数据


因为您的发送和接收队列系统彼此并肩工作,所以它们不断缓冲接收和发送的数据包。您的设置似乎发生的事情(据我假设)是您有一个循环来获取最新的数据包并分析它们。这意味着硬件(网络硬件的一部分)缓冲区充满了程序正在执行其他操作的数据包,并且当您的程序开始收集它们时,其中一些已经丢失。这导致一方去“我没有得到那些数据包,再次发送它们”,换句话说,你重新发送你应该吸进一个等待出列和分析的队列的数据包。无论程序以多快的速度返回以获取该数据并对其进行处理,队列都会增长(当然,您被限制在 RAM 中)。


另一种方法是做一个握手系统,其中一个程序等待直到最后一个数据包被传输、接收,而另一端则说“酷,给我下一个”。这会减慢您的下载/上传速度,但比从一个缓冲区末端落下的数据包要快一点(每个节点,例如您的路由器都会缓冲您的数据包,以防进入的数据包超过它可以处理的数量)循环)在网络中。


如果可以在一端或两端使用状态机,则应使用该状态机。当您的应用程序正在下载文件时,将其锁定为接收状态,这样它就不会尝试同时发送/接收其他内容。下载完成后,切换到任何其他状态(例如,打开文件状态)。如果你对状态机不太了解,我建议你看看维基百科的文章:

http://en.wikipedia.org/wiki/Finite-state_machine

于 2012-06-22T19:24:01.903 回答