2013-04-24 2 views
0

Я пытаюсь отправить несколько изображений один за другим автоматически с моего телефона Android на сервер (ПК) каждый раз, когда я снимаю изображение с камеры.Получение нескольких изображений через сокет TCP с использованием InputStream

Проблема заключается в том, что функция 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

Любая подсказка кому-нибудь? – Saaram

ответ

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 в том же порядке байт, чем вы receving его.

Также обратите внимание, что чтение и написание одного байта за один раз не является самым эффективным способом, но это проще, и буферизованные потоки позаботятся о большей эффективности воздействия.

+0

не работает – Saaram

Смежные вопросы