首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用android手机通过tcp/ip更快地发送字节

使用android手机通过tcp/ip更快地发送字节
EN

Stack Overflow用户
提问于 2015-04-27 06:08:21
回答 2查看 446关注 0票数 0

我在Nexus6上使用camera2 api for Android拍照,从我的代码到达onImageAvailable()的末尾到再次调用它几乎没有花费任何时间。

然而,通过tcp/ip发送我的图片需要大约700ms。

代码语言:javascript
复制
private ImageReader.OnImageAvailableListener mOnImageAvailableListener = 
new ImageReader.OnImageAvailableListener() {

    @Override
    public void onImageAvailable(ImageReader reader) 
    {
        Image image = mImageReader.acquireLatestImage();
        if(image.getPlanes().length == 0)
            return;

        ByteBuffer buffer = image.getPlanes()[0].getBuffer();
        if(buffer == null)
            return;

        byte[] pictureBytes = new byte[buffer.remaining()];
        buffer.get(pictureBytes);

        mOutputStream.write((String.valueOf(pictureBytes.length) + "....").getBytes());
        // FROM HERE
        mOutputStream.write(pictureBytes);
        // TO HERE TAKES ~700ms
        mOutputStream.flush();
}

按照android的要求,我的连接是在另一个线程中创建的,代码如下:

代码语言:javascript
复制
ServerSocket serverSocket = new ServerSocket(#);
Socket clientSocket = serverSocket.accept();
OutputStream outputStream = clientSocket.getOutputStream();

注意:主线程中的mOutputStream等于outputStream。我将outputStream传递给主线程。

我试过使用BufferedOutputStream,实际上比较慢。

我的手机和它所连接的设备之间的链接速度是130 my。对于小于2MB的图像,我应该能够每秒发送至少8张图片。

如何减少700ms的时间?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-04-27 23:43:01

即使你有130 able的连接到你的其他设备,如果你使用TCP,你也不能立即使用所有的带宽。这是因为TCP拥塞控制机制称为慢启动。

在每个连接的开始,TCP从发送少量数据开始,因为链路的容量是未知的。在收到ACK之前发送的通信量由拥塞窗口定义,根据配置的MSS (最大分段大小),它可能是MSS的2-4倍。确切的数量在RFC5681中定义:

代码语言:javascript
复制
   If SMSS > 2190 bytes:
       IW = 2 * SMSS bytes and MUST NOT be more than 2 segments
   If (SMSS > 1095 bytes) and (SMSS <= 2190 bytes):
       IW = 3 * SMSS bytes and MUST NOT be more than 3 segments
   If SMSS <= 1095 bytes:
       IW = 4 * SMSS bytes and MUST NOT be more than 4 segments

在接收到每个ACK后,拥塞窗口的大小随MSS的大小而增加。这实际上意味着窗口大小呈指数增长。尽管指数增长使TCP能够非常快地达到最大带宽,但对于相对较小的文件来说,这种速度还不够快。即使你的连接速度是100 able,你也不能每秒发送8张图片,因为传输时间相对较短,而且在相当长的一段时间内,窗口大小太小,无法让你使用全部可用的带宽。

根据往返时间的不同(往返于服务器之间),发送前1MB数据甚至可能需要500ms,因此每秒发送2张或3张以上的图像的可能性很小。

票数 0
EN

Stack Overflow用户

发布于 2015-05-01 07:58:13

我从Java切换到C#来读入字节。这是主要的瓶颈。我的速度高达3.33fps;这包括写入磁盘的时间。

但是,是的,我验证了图片小于2MB。

谢谢大家!

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29884167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档