2013-04-16 42 views
0

我試圖將audio file從服務器傳輸到客戶端,並將其寫入另一個文件。 server正在從客戶端讀取文件,但它正在不斷閱讀文件內容而忽略新行。例如,有一個像「我正在做客戶端服務器程序」的文本,在文件的下一行是「Java」。服務器讀作「我在做客戶端服務器編程Java」。 我的問題是如何逐行讀取內容系..Java ::服務器中的客戶端服務器程序沒有按行讀取文件中的文本

我的代碼如下...

*

服務器

**try 
{ 
` try 
     { 
      System.out.println("Im server waiting for client request"); 
      ss=new ServerSocket(2005); 
      Socket s=ss.accept(); 

      InputStream is = s.getInputStream();//Input Stream 
      BufferedReader fileRead =new BufferedReader(new  InputStreamReader(is)); 
      String fname = fileRead.readLine(); 


      OutputStream os = s.getOutputStream();//socket output stream 
      PrintWriter pw = new PrintWriter(os, true); 

      BufferedReader br = new BufferedReader(new FileReader(fname));//read File 

      String str;//initiating string and StringBuffer 

      StringBuilder sb=new StringBuilder(); 

      while((str = br.readLine()) != null) // reading line-by-line from file 
      { 
       sb.append(str);//append to stringBuffer sb 

      } 
      System.out.println("The string is in server" +sb); 

      pw.println(sb); 
      pw.flush(); 
      pw.close(); 
      is.close(); 
      fileRead.close(); 
     os.close(); 
     pw.close(); 
     br.close(); 

     } 
     catch(Exception e) 
     { 
      e.getMessage(); 
      e.getStackTrace(); 
      e.getSuppressed(); 
     }` 
The Client side:: 

    try { 
      System.out.println("Im client ..sending request"); 
      Socket s=new Socket("127.0.0.1",2005);//Initiate Socket 

      System.out.println("Enter filename"); 


      BufferedReader bw=new BufferedReader(new InputStreamReader(System.in));//Take fileName from keyBoard 

      String filename=bw.readLine();//Read filename into a string 

      OutputStream dout=new DataOutputStream(s.getOutputStream());//output Stream 
      PrintWriter pw=new PrintWriter(dout,true); 

      pw.println(filename);//write filename to socket 

      InputStream is = s.getInputStream();//Input Stream 
      BufferedReader in =new BufferedReader(new InputStreamReader(is)); 
      String clstr; 
      StringBuilder sd=new StringBuilder(); 
      while((clstr=in.readLine())!=null) 
      { 
       sd.append(clstr); 
      //clstr=in.readLine();//Read String From socket into "clstr" string 

      } 
      System.out.println("The string in client is" +sd); 

      File f=new File("A://music/kin.txt");//Open a file 

      if(!f.exists()) 
       f.createNewFile();//if not existed create it 

      try 
      { 
      //PrintWriter bf=new PrintWriter(new FileWriter(f)); //Write to a file 
       BufferedWriter bf=new BufferedWriter(new FileWriter(f)); 
      //bf.append(clstr); 
      //bf.write(sd); 
      bf.append(sd); 
      bf.flush(); 
      bf.close(); 
      } 
      catch(Exception e) 
      { 
       e.getMessage(); 
       e.getSuppressed(); 
       e.getStackTrace(); 
      } 

      System.out.println("The Content written is" +sd); 

      bw.close(); 
      pw.close(); 
     dout.close(); 
     in.close(); 
     is.close(); 

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

音頻文件中的新行? – Thihara

+0

請編輯您的代碼的縮進並刪除一些大量的連續空行。您更容易讓人們閱讀您的代碼,您就越有可能得到答案。 –

回答

6

您的描述遠不清楚,但我懷疑這是問題:

while((str = br.readLine()) != null) // reading line-by-line from file 
{ 
    sb.append(str);//append to stringBuffer sb 
} 

readLine()返回的值不是包含換行符......並且您沒有在StringBuilder中添加一個換行符。所以,如果你收到的線路:

  • 「第一」
  • 「第二」
  • 「第三」

結果將只是 「firstsecondthird」。你只需要添加一個適當的行打破自己:

// Or whatever line break you want 
String lineBreak = System.getProperty("line.separator"); 
while((str = br.readLine()) != null) 
{ 
    sb.append(str); 
    sb.append(lineBreak); 
} 

請注意,如果你真的試圖傳送音頻文件這樣,你不應該 - 音頻文件二進制數據,所以你應該剛剛從InputStream讀取;根本不要使用Reader,因爲這是爲文本數據設計的。

+0

+1特別是對於音頻文件的評論! –

+0

感謝您的寶貴答案。我目前正在傳輸一個文本文件。 – Krish

+0

@ user88368:那爲什麼要說你要傳輸一個音頻文件呢?請記住,如果您將代碼構建爲僅傳輸任何二進制數據,那麼它還會*處理文本文件... –

相關問題