2013-07-11 75 views
1

我想从一串从Android客户端到C#服务器的字符串发送文件。除其他外,字符串还将包含有关正在发送的文件的详细信息,例如:文件大小,文件名等。我遇到的问题是没有收到所有文件字节,因此原始文件无法在尽管我可以正确地检索所有的字符串,但仍然是目标。从Android客户端发送字符串和文件到C#服务器

我的C#服务器代码

     while (true) 
     { 
      Socket socket = listener.AcceptSocket(); 
      setStatus(socket.RemoteEndPoint + " Connected"); 

      try 
      { 
       // Open the stream 
       NetworkStream stream = new NetworkStream(socket); 
       System.IO.StreamReader sr = new StreamReader(stream); 

       //Get string data 
       //******************************************** 
       Teststr = sr.ReadLine(); 
       setStatus(Teststr); 


       FileSize = sr.ReadLine(); 
       long fileSizeLong = Convert.ToInt64(FileSize); 
       int length = (int)fileSizeLong; 
       setStatus("File size: " + length + " bytes"); 
       //******************************************** 


       //read bytes to buffer 
       byte[] buffer = new byte[length]; 

       int toRead = (int)length; 
       int read = 0; 
       while (toRead > 0) 
       { 
        int noChars = stream.Read(buffer, read, toRead); 
        read += noChars; 
        toRead -= noChars; 
       } 

       setStatus("File Recieved. Total bytes: " + Convert.ToString(buffer.Length)); 
       setStatus("Saving File"); 
       String recievedPath = "C:\\Test\\"; 
       BinaryWriter bWrite = new BinaryWriter(File.Open(recievedPath + "Test.png", FileMode.Create)); 
       bWrite.Write(buffer); 
       setStatus("File Saved to: " + recievedPath); 
       bWrite.Flush(); 
       bWrite.Close(); 
       stream.Flush(); 
       stream.Close(); 
      } 
      catch (Exception e) 
      { 
       setStatus(e.Message); 
      } 

      setStatus("Disconnected"); 
      socket.Close(); 
     } 

我的Android客户端代码

    File file = new File(configstr[2]); //create file instance 
      try { 

      client = new Socket(configstr[0], Integer.valueOf(configstr[1])); 

      //Read file 
      fileInputStream = new FileInputStream(file); 

      outputStream = client.getOutputStream(); 

      //Output database details to stream 
      //***************************************** 

      //Holds the string before conversion to bytes 
      String text = ""; 

      text = "Test\n"; 
      outputStream.write(text.getBytes()); 

      text = String.valueOf(file.length()) + "\n"; 
      outputStream.write(text.getBytes()); 
      //***************************************** 

      outputStream.flush(); 

      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      byte[] b = new byte[1024]; 
      int bytesRead = 0; 
      while ((bytesRead = fileInputStream.read(b)) != -1) { 
       bos.write(b, 0, bytesRead); 
      } 
      byte[] bytes = bos.toByteArray(); 
      outputStream.write(bytes); 

      outputStream.flush(); 
       return true; 
      } catch (UnknownHostException e) { 
      e.printStackTrace(); 
      return false; 
      } catch (IOException e) { 
      e.printStackTrace(); 
      return false; 
      } 

注:该代码工作得很好,如果我只发送一个字符串,例如:如果我只发送文件的大小。

任何更好的方式来得到这个工作,因为我想通过流发送很多字符串以及来自文件的二进制数据。

回答

2

BufferedWriter和flush()在每个write()的末尾解决了我的问题。

相关问题