使用InputStream通过TCP套接字接收多个图像

时间:2013-04-24 10:04:21

标签: java sockets tcp inputstream

每次从相机捕捉图像时,我都会尝试从我的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
...
...
...
...

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分: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设置为与您接收它相同的字节顺序。

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