0

每次从相机捕获图像时,我都会尝试将多张图像从我的 android 手机自动发送到服务器(PC)。

问题是该read()功能仅在第一次阻塞。因此,从技术上讲,只有一张图像被接收并完美显示。但是之后is.read()返回时-1,此函数不会阻塞,并且无法接收多个图像。

服务器的代码很简单

while (true) {
    InputStream is = null;
    FileOutputStream fos = null;
    BufferedOutputStream bos = null;

    is = sock.getInputStream();

    if (is != null)
        System.out.println("is not null");

    int bufferSize = sock.getReceiveBufferSize();

    byte[] bytes = new byte[bufferSize];
    while ((count = is.read(bytes)) > 0)
    {
        if (filewritecheck == true)
        {
            fos = new FileOutputStream("D:\\fypimages\\image" + imgNum + ".jpeg");
            bos = new BufferedOutputStream(fos);
            imgNum++;
            filewritecheck = false;
        }
        bos.write(bytes, 0, count);
        System.out.println("count: " + count);
    }
    if (count <= 0 && bos != null) {
        filewritecheck = true;
        bos.flush();
        bos.close();
        fos.close();
    }
}

接收到图像后的输出是

is not null
is not null
is not null
is not null
is not null
is not null
is not null
is not null
...
...
...
...

任何帮助将不胜感激。

4

1 回答 1

0

如果你想在同一个流上接收多个图像,你应该建立某种协议,例如:读取一个表示每个图像的字节数的 int。

<int><b1><b2><b3>...<bn> <int><b1><b2><b3>...<bn> ...

然后你可以这样读取每张图片:

...
is = sock.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);

if (is != null)
    System.out.println("is not null");

while (true) {
    // Read first 4 bytes, int representing the lenght of the following image
    int imageLength = (bis.read() << 24) + (bis.read() << 16) + (bis.read() << 8) + bis.read();

    // Create the file output
    fos = new FileOutputStream("D:\\fypimages\\image" + imgNum + ".jpeg");
    bos = new BufferedOutputStream(fos);
    imgNum++;

    // Read the image itself
    int count = 0;
    while (count < imageLength) {
        bos.write(bis.read());
        count += 1;
    }
    bos.close();
}

请注意,您还必须修改发送者,并将 imageLength 放在与接收它相同的字节顺序中。

另请注意,一次读取和写入一个字节并不是最有效的方法,但它更容易,并且缓冲流可以处理大部分性能影响。

于 2013-04-24T14:04:04.773 回答