每次从相机捕捉图像时,我都会尝试从我的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
...
...
...
...
任何帮助都将受到高度赞赏。
答案 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设置为与您接收它相同的字节顺序。
另请注意,一次读取和写入一个字节不是最有效的方法,但它更容易,缓冲流可以处理大部分性能影响。