2014-12-31 4 views
0

Я отправляю изображение из приложения java pc в приложение для Android через сокеты. Мое изображение, которое я отправляю, по-разному не читает байтовый файл андроида [], и он имеет разные результаты для того, как большая часть изображения декодируется. Вот мой кодПоток не читает все изображение

Desktop:

Socket socket = new Socket("127.0.0.1", 59900); 
      // BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); 

      OutputStream outputStream = socket.getOutputStream(); 

      Robot r = new Robot(); 
      Toolkit t = Toolkit.getDefaultToolkit(); 
      Rectangle rect = new Rectangle(t.getScreenSize()); 
      BufferedImage img = r.createScreenCapture(rect); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      ImageIO.write(img, "jpg", baos); 

      byte[] size = ByteBuffer.allocate(4).putInt(baos.size()).array(); 
      outputStream.write(size); 
      outputStream.write(baos.toByteArray()); 
      //outputStream.flush(); 

      System.out.println("Flushed: " + System.currentTimeMillis()); 

      //Thread.sleep(12000); 
      System.out.println("Closing: " + System.currentTimeMillis()); 
      socket.close(); 

код Android

ServerSocket server = new ServerSocket(59900); 
     Socket socket = server.accept(); 

     InputStream inputStream = socket.getInputStream(); 

     System.out.println("Reading: " + System.currentTimeMillis()); 

     byte[] sizeAr = new byte[4]; 
     inputStream.read(sizeAr); 
     int size = ByteBuffer.wrap(sizeAr).asIntBuffer().get(); 
     byte[] imageAr = new byte[size]; 
     inputStream.read(imageAr); 
     // ByteArrayInputStream bis = new ByteArrayInputStream(imageAr); 

     bp = BitmapFactory.decodeByteArray(imageAr, 0, size); 

Вот картина того, что результат выглядит enter image description here

+0

ByteBuffer.allocate (4) .. попробуйте изменить здесь с 4 по 16 и посмотреть, что будет –

+0

Изображение не создается, когда я это делаю. – Gallo2fire

+2

Помните, что _inputStream.read (imageAr) _ не обязательно считывает полную длину массива. Вам нужно проверить возвращаемое значение, чтобы увидеть фактическое количество отсчетов байтов. – harism

ответ

0

Как вы закрываете сокет после отправки изображение, вам не нужно отправлять счет, и поэтому вам не нужны ByteBuffer, ByteArrayOutputStream или ByteArrayInputStream. Или сон. Избавьтесь от них и напишите изображение непосредственно в выходной поток сокета и прочитайте его непосредственно из входного потока сокета с помощью ImageIO.read().

+0

Опираясь на сокет закрыть плохая идея. Вы должны знать, когда изображение будет завершено, поэтому вам нужно отправить счет. TCP не требует времени, вы можете получить последний байт через 3 минуты. – ElderBug

+0

@ ElderBug Закрытие - это идея OP, а не моя, но ваш комментарий не имеет смысла. Изображение завершается при возврате 'ImageIO.read()'. TCP-так называемое отсутствие «требований времени» не имеет к этому никакого отношения. – EJP

+1

Тогда вы должны упомянуть 'ImageIO' в своем ответе. _ "читать его непосредственно из входного потока сокета" _ означает 'InputStream.read()' мне. – ElderBug

0

Существует общее заблуждение, что чтение N байтов из сокета будет возвращать N байтов. Считывание сокетов возвращает всякий раз, когда он хочет (обычно, когда в полученных байтах имеется временной промежуток, который сильно зависит от сети). N - это максимальное количество байтов.

Чтобы решить эту проблему, вы можете либо цикл до тех пор, пока у вас есть количество байтов, необходимых, или использовать специализированные потоки, как DataOutputStream и DataInputStream, которые предлагают write() и readFully() метод. Они также предоставляют writeInt() и readInt(), что упрощает отправку размера.

+0

Чтение вызова не возвращается, когда оно хочет: оно блокируется, пока не будет доступен хотя бы один байт, или конец потока или ошибка. 'DataOutputStream' не предлагает метод' readFully() '. – EJP

+1

@EJP О, правда? Вы ребенок? Конечно, поток вывода не имеет метода чтения. Зачем вам это делать? Ouput streams всегда пишут полностью, им не нужен такой метод. – ElderBug

+0

Я комментирую, что вы опубликовали. Вы написали «предложение», которое является множественным, и поэтому оно охватывает как субъекты вашего предложения, так и я цитирую «DataOutputStream» и «DataInputStream». Он открыт для вас, чтобы исправить ваш пост. – EJP

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