从套接字读取数据的时间很长

时间:2012-06-22 12:50:58

标签: android sockets data-transfer

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

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

有人能建议任何更好的方法吗?

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

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();

1 个答案:

答案 0 :(得分:-1)

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

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

发送接收线程;发送线程推出你放入队列的数据包:


| P | - 包含在程序的Que部分内的数据包

发出线程< - | P | P | P | < -app /程序

表示赞赏 - > | P | P | P | P - >应用程序/程序deques and analysis data


因为您的发送和接收排队系统彼此协同工作,所以它们不断地缓冲接收和发送的数据包。您的设置似乎正在发生的事情(据我所知)是您有一个循环,它抓取最新的数据包并分析它们。这意味着硬件(网络硬件的一部分)缓冲区溢出了程序正在执行其他操作的数据包,当程序收集它们时,其中一些丢失了。这导致一方“我没有得到那些数据包,再次发送它们”,换句话说,你重新发送你应该被吸入到等待出队和分析的Que的数据包。无论程序返回多快以获取数据并使用它(当然,您只限于RAM),队列都可以增长。这样你就可以确保拥有你应该接收的数据包,而不是依赖你的网卡/接收器为你保留它们,可能会溢出它的缓冲区。


另一种方法是做一个握手系统,其中一个程序等待,直到最后一个数据包被传送,收到,另一方变为“酷,发送给我下一个”。这会降低您的下载/上传速度,但比从其中一个缓冲区结束时丢失的数据包快一点(每个节点,例如您的路由器缓冲您的数据包,以防更多进入,而不是它可以处理的数据包)循环)在网络中。


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

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