2011-01-08 21 views
6

Bir sunucuya resim göndermeye çalıştığım bir Android uygulamasına sahibim. Bunu Base64 kodlamasını kullanarak yaptım ve çok iyi çalıştı, ancak göndermeden önce resmi kodlamak için çok fazla bellek (ve zaman) gerekiyordu.Java/Android: Bir yuva üzerinde bir bayt dizisi okuma/yazma

Android uygulamasını, yalnızca bayt dizisini gönderdiği yere indirmeye çalışıyorum ve herhangi bir kodlama şemasıyla uğraşmadığı için mümkün olduğunca fazla bellek ve CPU döngüsü kaydedecek. Sunucu Java ile yazılmış

public String sendPicture(byte[] picture, String address) { 
    try { 
     Socket clientSocket = new Socket(address, 8000); 
     OutputStream out = clientSocket.getOutputStream(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     out.write(picture); 
     return in.readLine(); 
    } 
    catch(IOException ioe) { 
     Log.v("test", ioe.getMessage()); 
    } 
    return " "; 
} 

:

Bu benim Android kod gibi görünmek istiyorum şeydir. Sunucu kodunu nasıl yazarım, böylece aynı bayt dizisini düzgün bir şekilde alabilirim? Amacım mümkün olduğunca çok sayıda CPU döngüsü kaydetmektir.

Şimdiye kadar, denediğim tüm yöntemler bozuk veri veya atılmış bir istisna ile sonuçlandı.

Herhangi bir yardım için teşekkür ederiz. Böyle

cevap

2

Robert'ın ve Zaki'nin yorumuna dayanarak, burada daha iyi performans göstermesi gereken değiştirilmiş kod.

public byte[] getPicture(InputStream in) { 
    try { 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    byte[] data = new byte[1024]; 
    int length = 0; 
    while ((length = in.read(data))!=-1) { 
     out.write(data,0,length); 
    } 
     return out.toByteArray(); 
    } catch(IOException ioe) { 
    //handle it 
    } 
    return null; 
} 
3

deneyin şey: Eğer çift yönlü iletişimi istiyorsanız

public byte[] getPicture(InputStream in) { 
    try { 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     int data; 
     while ((data = in.read())>=0) { 
      out.write(data); 
     } 
     return out.toByteArray(); 
    } catch(IOException ioe) { 
     //handle it 
    } 
    return new byte[]{}; 
} 
+0

Akıştan bayt için yapılan ancak okunan bayt değerleri tamamen verimsiz ve yavaştır. Bir kerede en az 1024 bayt okumak daha iyidir. – Robert

+0

Yeni bayt yerine [] {} yerine null döndürmek daha iyi bir fikir olurdu. – Zaki

0

, sunucu hazır olduğunda bilmelidir - sen sayısını belirten gönderen tarafına 4 bayt uzunluğu alanını Önlerine gerekir bayt gelmek.

Sunucu tarafında uzunluğu okuyun ve sonra her şey gelene kadar dinlemeye devam edin. Daha sonra onay dizenize cevap verebilirsiniz.

Sadece fotoğrafı göndermek yeterli ise, verileri gönderebilir ve ardından bağlantıyı kapatabilirsiniz. Sunucu tarafı @thejh ile gösterildiği gibi uygulanır.

İlgili konular