Java 使用android手机通过tcp/ip发送字节速度更快

Java 使用android手机通过tcp/ip发送字节速度更快,java,android,tcp,ip,android-camera,Java,Android,Tcp,Ip,Android Camera,我正在Nexus6上用Android的Camera2API拍照。从我的代码到达onImageAvailable()的末尾到再次调用它,几乎不花任何时间 然而,通过tcp/ip发送我的图片需要大约700毫秒 private ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() { @Override public vo

我正在Nexus6上用Android的Camera2API拍照。从我的代码到达onImageAvailable()的末尾到再次调用它,几乎不花任何时间

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

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的要求,我的连接是在另一个线程中创建的,代码如下:

ServerSocket serverSocket = new ServerSocket(#);
Socket clientSocket = serverSocket.accept();
OutputStream outputStream = clientSocket.getOutputStream();
注意:主线程中的mOutputStream等于outputStream。我将outputStream传递给主线程

我尝试过使用BufferedOutputStream,但实际上速度较慢


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


如何缩短700毫秒的时间?谢谢大家!

如果使用TCP,即使您与其他设备的连接速度为130mbps,您也无法立即使用所有带宽。这是因为TCP拥塞控制机制称为慢启动

在每个连接开始时,TCP首先发送少量数据,因为链路的容量未知。在接收到ACK之前发送的通信量由拥塞窗口定义,取决于配置的MSS(最大段大小),它可能是MSS的2-4倍。具体金额在RFC5681中定义:

   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
如果SMSS>2190字节:
IW=2*SMSS字节,且不能超过2个段
如果(SMSS>1095字节)和(SMSS我从Java切换到C#来读取字节。这是主要的瓶颈。我的速度高达3.33 fps;这包括写入磁盘的时间

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


谢谢大家!

压缩图像将有助于“处理小于2MB的图像”--这是一张相当低分辨率的照片。你确定吗?另外,当你检查你编写的服务器时,你对读取的字节做了什么?你的700ms可能阻止了服务器读取字节。如果读取是瓶颈,那是你的读取代码,而不是平台。