2013-04-22 55 views
1

C#代碼發送文件,中斷閱讀整個文件

private MemoryStream Read() { 
     NetworkStream clientStream = _client.GetStream(); 
     MemoryStream messageStream = new MemoryStream(); 

    var inbuffer = new byte[65535]; 

    if(clientStream.CanRead) { 
     do { 
      int bytesRead = clientStream.Read(inbuffer,0,inbuffer.Length); 
      messageStream.Write(inbuffer, 0, bytesRead); 
      messageStream.Flush(); 
      Debug.Print(messageStream.Length + " added " + bytesRead); 
     } while(clientStream.DataAvailable); // GOES BEYOND HERE, EVEN THOUGH THERE'S MORE DATA 
    } 

    messageStream.Position = 0; 
    return messageStream; 
} 

Android的代碼之前

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

       if(resultCode == RESULT_OK){     
         if(requestCode == ATTACH_FILE_REQUEST){ 
           writeToSocket("<FILE>generic.jpeg"); 
           InputStream input = null; 
           String filePath = data.getData().getPath().toString(); 
           try { 
             input = getContentResolver().openInputStream(data.getData());     
             BufferedInputStream bufferedInputStream = new BufferedInputStream(input); 
             byte[] bytes = new byte[65535]; 
             ByteArrayOutputStream byteArray = new ByteArrayOutputStream(); 
               while((bufferedInputStream.read(bytes)) != -1){ 
                 byteArray.write(bytes, 0, bytes.length);         
               } 
               socketNetworkHelper.writeFile(byteArray.toByteArray()); 
           } catch (FileNotFoundException e1) { 
             // TODO Auto-generated catch block 
             e1.printStackTrace(); 
             Toast.makeText(this, "Error in file selection", Toast.LENGTH_LONG).show(); 
           } catch (IOException e2){ 
             e2.printStackTrace(); 
             Toast.makeText(this, "Input/Output Error", Toast.LENGTH_LONG).show(); 
           }   
         } 
       } 
} 

在SocketNetworkHelper.java其具有連接插座:

public void writeFile(byte[] buffer) { 

       try { 
         socket.getOutputStream().write(buffer); 

       } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
       } 
     } 

現在的問題是:如何獲取整個文件?

+0

什麼是你的問題? – 2013-04-22 11:06:35

+0

主/ UI線程上的網絡操作,對嗎?別。 – 2013-04-22 11:09:17

+0

@ClassStacker:不,它是另一個線程。不是問題:) – 2013-04-22 11:10:52

回答

0

您還可以發送文件大小作爲一個參數

private MemoryStream Read(int filesize) { 
      NetworkStream clientStream = _client.GetStream(); 
      MemoryStream messageStream = new MemoryStream(); 
      var inbuffer = new byte[filesize]; 

      if (clientStream.CanRead) { 
       int totalBytesRead = 0; 
       do { 
        int bytesRead = clientStream.Read(inbuffer, 0, inbuffer.Length); 
        totalBytesRead += bytesRead; 
        messageStream.Write(inbuffer, 0, bytesRead); 
        messageStream.Flush(); 
       } while (totalBytesRead < filesize); 

      } 
      messageStream.Position = 0; 
      return messageStream;