2016-04-11 15 views
2

Yaklaşık 500kb olan bir görüntü göndermiştim ama sunucuda, görüntü 500kb'den fazla. Bu mantık var mı diye merak ediyorum Ben yaptım sorunları? Ağın hızı yaklaşık 100kb/s'dir.sunucunun veri alıcıdan daha fazla alması garip bir durumdur.

istemci

package client; 

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.BufferedWriter; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.OutputStreamWriter; 
import java.net.Socket; 

public class client { 
    public static void main(String[] args) { 
     Socket s = null; 
     BufferedOutputStream bo = null; 
     BufferedInputStream bi = null; 
     try { 
      s = new Socket("127.0.0.1",12349); 
      bo = new BufferedOutputStream(s.getOutputStream()); 
      bi = new BufferedInputStream(new FileInputStream("1.jpg")); 
      byte [] bys =new byte[1024]; 
      while((bi.read(bys))!=-1){ 
       bo.write(bys); 
      } 
      bo.flush(); 
      System.out.println("already post the image"); 
      bi.close(); 

     } catch (IOException e) { 

     }finally{ 
      try { 
       s.close(); 
      } catch (IOException e) { 
       System.out.println("close failed"); 
      } 
     } 
    } 
} 

sunucu

package server; 

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class sserver { 
    public static void main(String[] args) { 
     ServerSocket ss = null; 
     Socket s = null; 
     BufferedOutputStream bo = null; 
     BufferedInputStream bs = null; 
     try { 
      ss = new ServerSocket(12349); 
      s = ss.accept(); 
      bo = new BufferedOutputStream(new FileOutputStream("2.jpg")); 
      bs = new BufferedInputStream(s.getInputStream()); 
      byte [] bys =new byte[1024]; 
      while((bs.read(bys))!=-1){ 
       bo.write(bys); 
      } 
      bo.flush(); 
      System.out.println("upload success"); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }finally{ 
      try { 
       ss.close(); 
      } catch (IOException e) { 
       System.out.println("close failed"); 
      } 
     } 

    } 
} 

cevap

1
sorun bayt sayısını göz ardı olmasıdır

okuyun:

while((bi.read(bys))!=-1){ 
    bo.write(bys); 
} 

Burası her zaman 1024 bayt yazma anlamına gelir bo, bi'dan 1024 bayttan daha az okuyor olsanız bile.

Bir değişkene okunan bayt sayısını atayabilir ve yazma çağrısına o geçmesi gerekiyor:

int bytesRead; 
while((bytesRead = bi.read(bys))!=-1){ 
    bo.write(bys, 0, bytesRead); 
} 
+0

çok teşekkür ederim, gerçekten işe edilir! –

0

sizin gibi alınan exacte bayt yazınız

 int len= 0 ; 
     while((len = bi.read(bys))!=-1){ 
      bo.write(bys,0, len); 
     } 

aynı kod altında İstemci ve sunucu tarafında gerekli değişiklik. Sonunda test ettim ve her iki dosyanın da aynı boyutta değiştiğini fark ettim.

0

Sunucu kodunuz her zaman bayt dizisinin uzunluğunu çıkış akışına yazıyor.

Uygun şekilde yapmak:

byte [] bys =new byte[1024]; 
while(true) { 
    int numRead = bs.read(bys); 
    if (numRead == -1) 
    break; 
    bo.write(bys, 0, numRead); 
} 
+0

Bunu yapmanın doğru yolu olamaz - derleme yapmaz. –

İlgili konular