2013-08-16 63 views
0

我試圖修改我最初只能發送字符串的android代碼。任務是讓它可以傳輸圖片。我知道有很多不同的方法來實現這一點。但我試過,真的不知道爲什麼我的照片無法發送,雖然連接沒有問題。 有誰能告訴我?我會很感激它。 我只是一個初學者,請忘記我可憐的編程技巧。Android:如何通過套接字正確發送圖片

這裏是服務器的下面

private Runnable socket_server = new Runnable(){ 
    public void run(){ 
     handler.post(new Runnable() { 
      public void run() { 
       test.setText("Listening...." + getMyIp()); 

      } 
     }); 
     try{ 
      serverSocket = new ServerSocket(1234); 

      while (true) { 
       Socket client = serverSocket.accept(); 

       handler.post(new Runnable() { 
        public void run() { 
         test.setText("Connected."); 
        } 
       }); 
       try { 
        File myFile = new File ("/sdcard/DCIM/img2.jpg"); 
         byte [] mybytearray = new byte [(int)myFile.length()]; 
         FileInputStream fis = new FileInputStream(myFile); 
         BufferedInputStream bis = new BufferedInputStream(fis); 
         bis.read(mybytearray,0,mybytearray.length); 
         OutputStream os = client.getOutputStream(); 
         os.write(mybytearray,0,mybytearray.length); 
         os.flush(); 
         client.close(); 
        test.setText("Received."); 

       } catch (Exception e) { 
        handler.post(new Runnable() { 
         public void run() { 
          test.setText("Sending erro"); 
         } 
        }); 
       } 
      } 
     }catch(IOException e){ 
      handler.post(new Runnable() { 
       public void run() { 
        test.setText("Fail to buitl the socket"); 
       } 
      }); 
     } 
    } 
}; 

主要部分,這裏是客戶

new Thread() 
      { 
       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        InetAddress serverAddr = null; 
        SocketAddress sc_add = null; 
        Socket socket = null; 

        try 
        { 
         serverAddr = InetAddress.getByName("192.168.1.105"); 
         sc_add= new InetSocketAddress(serverAddr,1234); 
         socket = new Socket(); 
         socket.connect(sc_add,2000); 

         File myFile = new File("/sdcard/DCIM/img2.jpg"); 
         InputStream fis = new FileInputStream("/sdcard/DCIM/img2.jpg"); 
         OutputStream outputStream = socket.getOutputStream(); 

         byte [] buffer = new byte[(int)myFile.length()]; 

         int temp = 0 ; 
         while((temp = fis.read(buffer)) != -1){ 
          outputStream.write(buffer, 0, temp); 
         } 
         outputStream.flush(); 
         socket.close(); 


       } catch (UnknownHostException e) { 

        //TextView01.setText("InetAddress fail"); 

       } catch (SocketException e) { 

        //TextView01.setText("fail to develop socket"); 

       } catch(IOException e) { 

        //TextView01.setText("fail to sending"); 

       } 
       } 

      }.start(); 

回答

2

這是你的問題的一部分:

byte [] mybytearray = new byte [(int)myFile.length()]; 
// ... 
bis.read(mybytearray,0,mybytearray.length); 
OutputStream os = client.getOutputStream(); 
os.write(mybytearray,0,mybytearray.length); // <- This one. 

我寫這個了一次,這裏:Working unbuffered streams

問題是,這段代碼假設緩衝區完全是 滿了,這不一定是這種情況。爲 InputStream.read(字節[],INT,INT)文檔狀態:

讀取從輸入流數據的高達 len個字節成 字節的數組。試圖讀取儘可能多的len字節,但可能會讀取較小的 數字。實際讀取的字節數作爲整數返回爲 。 [...]

因此,緩衝區不保證是滿的。當我們使用OutputStream.write(byte[], int, int)-方法將讀取字節寫入輸出流時,此 成爲問題。它 文檔讀取:

寫入[恰好]從指定的字節數組起始於 len個字節偏移量off此輸出流。 [...]

這裏是一個工作實現:

byte buffer[] = new byte[1024]; 
int read_count = 0; 
while ((read_count = input.read(buffer, 0, buffer.length)) != -1) { 
    output.write(buffer, 0, read_count); // Now writes the correct amount of bytes 
} 

而且,緩衝不應該是一樣大的整個文件,因爲文件中的數據塊傳輸更加高效。看到這個老問題的詳細解釋:How do you determine the ideal buffer size when using FileInputStream?

+0

真的謝謝你的明確答案。但我試過你顯示的方式,似乎仍然有一些問題與我的程序... –

+1

更新您的問題與更多的信息 –