2016-04-11 32 views
0

Bu program belirtilen görüntüyü titreşimden indirmelidir. Bu bir ev ödevi sorusu, soket kullanmalıyım. Programım başarılı bir şekilde http isteği yapar ve yanıtı alır. Ben üstbilgileri ortadan kaldırır ve bir jpg dosyasına bayt yazar. i bir görüntü görüntüleme programı ile açmak istediğinizde Fakat, diyor:kodlama belirtimi gereklidir?

Hata

200 Yani ben separetly görüntü indirilen ve durumda JPEG kütüphaneye JPEG görüntü dosyası (Yanlış çağrıyı yorumlama bir metin editörü açıldı, bu dönüştürülmez bunun bazı kısımları gibi görünüyor

orijinal dosya.

\ FF \ D8 \ FF \ E0 \ 00JFIF \ 00 \ 00 \ 00 \ 0 00 \ 0 \ 00 \ FF \ E2 \ A0ICC_PROFILE

indirilen dosya:

ᅵᅵᅵᅵ \ 00JFIF \ 00 \ 00 \ 00 \ 00 \ 00 \ 00ï¿œï¿ characterï¿œICC_PROFILE

Bu, karakter kodlamasıyla mı ilgili? öyleyse, kodlamayı nasıl belirtmeliyim? Ya da jpeg dosyasını gerçekten almak için ne yapmalıyım?

public class ImageReceiver { 
public static void main(String[] args) { 
    String imglink = "https://farm2.staticflickr.com/1495/26290635781_138da3fed8_m.jpg"; 
    String flicker = "farm2.staticflickr.com"; 

    Socket socket = null; 
    DataOutputStream out; 

    try { 
     socket = new Socket(flicker, 80); 
     out = new DataOutputStream(socket.getOutputStream()); 

     out.writeBytes("GET "+ imglink +" HTTP/1.1\r\n"); 
     out.writeBytes("Host: "+ flicker +":80\r\n\r\n"); 
     out.flush(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    DataInputStream in = null; 
    OutputStream output = null; 

    try { 
     in = new DataInputStream(socket.getInputStream()); 
     output = new FileOutputStream("chair.txt"); 

     System.out.println("input connection is established"); 

     byte[] bytes = new byte[2048]; 
     int length;  
     boolean eohFound = false; 

     while ((length = in.read(bytes)) != -1) { 
      if(!eohFound){ 
       String string = new String(bytes, 0, length); 
       int indexOfEOH = string.indexOf("\r\n\r\n"); 
       if(indexOfEOH != -1) { 
        System.out.println("index: " + indexOfEOH); 
        length = length - indexOfEOH - 4; 
        System.out.println(length); 
        bytes = string.substring(indexOfEOH + 4).getBytes(); 
        eohFound = true; 
       } else { 
        length = 0; 
       } 
      } 
      output.write(bytes, 0, length); 
      output.flush(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


    try { 
     in.close(); 
     output.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    System.out.println("Image is downloaded"); 

} 

} EJP yardımıyla

+2

Sen kabul edemeyiz tüm '\ r \ n \ r \ dizisi tek bir okuma geldiğinde n' ve kesinlikle 'String'i ikili veri için bir kap olarak kullanamazsınız. Önce tüm başlık satırlarını okuyacağım ve sonra kopya döngüsünü başlatacağım. – EJP

+0

İndeksOfEOH ve uzunluğu yazdırdığımda (kodu çalıştırırsanız, yazdırır), bana uygun görünüyor. Demek istediğim endeksi. Aksi takdirde, içeriye asla girmemeli, değil mi? \ R \ n \ r \ n'ye ulaştığımdan emin olmak için başlık satırlarını nasıl okumalıyım? – user3717434

+1

'DataInputStream.readLine() 'ile ve evet, kullanımdan kaldırıldığını biliyorum. – EJP

cevap

1

, benim kod yeniden yazdım. Burada sadece değiştirilmiş parça. Ben taleb() i yeni bir satır varana dek o zaman ben bayt olarak okumak ve dosyaya yazma:

try { 
     in = new DataInputStream(socket.getInputStream()); 
     output = new FileOutputStream("chair.jpg"); 

     byte[] bytes = new byte[2048]; 
     int length; 

     String inputLine; 

     //Get rid of headers... 
     while ((inputLine = in.readLine()) != null){ 
      if(inputLine.equals("")) 
       break; 
     } 


     while ((length = in.read(bytes)) != -1) { 
      output.write(bytes, 0, length); 
      output.flush(); 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    }