2013-10-26 27 views
-2

嗨我從兩個Android設備之間的服務器套接字傳輸到客戶端套接字的圖像。我得到的圖像,但它是在size.here 0字節是我的代碼如何從android中的套接字獲取完整圖像?

發件人:

// LISTEN FOR INCOMING CLIENTS 
        Socket client = serverSocket.accept(); 
        File myFile = new File("/sdcard/DCIM/d.png"); 
        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(); 
        serverStatus.setText("sending..."); 
        os.write(mybytearray,0,mybytearray.length); 
        os.flush(); 
        client.close(); 
        handler.post(new Runnable() { 

         @Override 
         public void run() { 
          serverStatus.setText("Connected."); 

         } 
        }); 

接收器:

public void run() { 
     try { 
      InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
      Log.d("ClientActivity", "C: Connecting..."); 
      Socket socket = new Socket(serverAddr, ServerActivity.SERVERPORT); 
      connected = true; 
      byte[] mybytearray = new byte[filesize]; 
      InputStream is = socket.getInputStream(); 
      FileOutputStream fos = new FileOutputStream("/sdcard/j.png"); 
      BufferedOutputStream bos = new BufferedOutputStream(fos); 
      bytesRead = is.read(mybytearray,0,mybytearray.length); 
      current = bytesRead; 
      do{ 
       bytesRead = is.read(mybytearray,current,(mybytearray.length-current)); 
       if(bytesRead > 0){ 
        current +=bytesRead; 
       } 
      }while(bytesRead > 0); 
      bos.write(mybytearray,0,current); 
      bos.flush(); 
      long end = System.currentTimeMillis(); 
      System.out.println(end-start); 
      bos.close(); 
      socket.close(); 
      while (connected) { 
       try { 
        Log.d("ClientActivity", "C: Sending command."); 
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket 
           .getOutputStream())), true); 
         // WHERE YOU ISSUE THE COMMANDS 
         out.println("Hey Server!"); 
         Log.d("ClientActivity", "C: Sent."); 
       } catch (Exception e) { 
        Log.e("ClientActivity", "S: Error", e); 
       } 

是什麼毛病此代碼?在此先感謝..

+1

是的。奇怪的是,它不起作用。對於大約百萬次,發生的事情不應該發生,發生的事情不會發生,打印出來的是什麼,您自己調試的結果是什麼? –

+0

我得到一個0字節的j.png文件。但我需要將完整的圖像從一個設備傳輸到另一個設備。 – nick

回答

2

這個代碼有什麼不對嗎?

您打賭。

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

這裏我們假定你是(1),該文件的長度適合的int,和(2),該文件的內容將裝入內存。

bis.read(mybytearray,0,mybytearray.length); 

這裏假設讀取填充緩衝區。

byte[] mybytearray = new byte[filesize]; 

在這裏,你將再次假設(3),該文件的內容將裝入內存,以及(4)filesize確實是該文件的正確長度。你沒有說明接收機怎麼可能知道這一點。

bytesRead = is.read(mybytearray, 0, mybytearray.length); 
current = bytesRead; 
do { 
    bytesRead = is.read(mybytearray, current, (mybytearray.length - current)); 
    if (bytesRead > 0) { 
     current += bytesRead; 
    } 
} while (bytesRead > 0); 
bos.write(mybytearray, 0, current); 

這裏你(5)不檢查第一次讀取的結果和(6)沒有意義地將整個輸入讀入緩衝區。你不需要那樣做。在Java中複製流的規範的方法如下:

while ((count = in.read(buffer)) < 0){ 
    out.write(buffer, 0, count); 
} 

它工作在兩端,即,用於發送和接收,並與任何緩衝區大小大於零。使用這兩個來發送文件並接收它。

相關問題