2011-12-19 77 views
2

我正在學習java,我遇到了一些插座問題。我開發了一個簡單的客戶端 - 服務器應用程序 - 那種敲敲敲,它執行4個步驟:套接字,BufferedReader.readline() - 爲什麼流沒有準備好?

  1. 客戶端發送一些信息給服務器
  2. 服務器臨危他們並保存到文件
  3. 服務器返回給客戶端一些其他的消息
  4. 客戶臨危他們,同時也可以保存的文檔

問題出現在第4步:客戶端沒有收到消息,並且永遠不會退出循環:

while ((inStr = in.readLine()) != null) { 
    writer.println(inStr); 
} 

其中是BufferedReader類型:

try { 
     socket = new Socket(ipAddress, 4444); 
     out = new PrintWriter(socket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

在服務器端發送消息:

try { 
     socket = srvSocket.accept(); 
     out = new PrintWriter(socket.getOutputStream(), true);   
     in = new BufferedReader(new InputStreamReader(socket.getInputStream()));     
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

...

out.println("test from server #1"); 
    out.println("test from server #2"); 

在客戶端我看着in.ready() - 它返回false。在服務器端,我看到out.checkError() - 它返回true;

我在做什麼錯 - 爲什麼是空的流?

任何幫助ia感謝! :)

+0

有什麼異常? – Tudor 2011-12-19 15:43:31

+0

在寫完行後嘗試'out.flush()'。 – nos 2011-12-19 15:44:24

+0

@Sergio:正如你所說,發送消息的服務器代碼在哪裏? – 2011-12-19 15:46:50

回答

-1

這可能/可能無法解決您的問題。但請儘量保留Try Catch塊中的所有內容。例如:您的ServerSocket初始化,寫入程序塊等。如果發生錯誤,您可能無法使用寫入器,所以在初始化時沒有意義。
 您可以嘗試寫入標準輸出流以進行調試而不是文件。服務器/客戶端的代碼是你的一個小的變體,它的工作。

服務器:

Socket socket; 
    ServerSocket srvSocket; 
    BufferedReader in; 
    PrintWriter out; 
    try { 
     srvSocket=new ServerSocket(4444); 
     socket = srvSocket.accept(); 
     out = new PrintWriter(socket.getOutputStream(), true);   
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     out.println("test from server #1"); 
     out.println("test from server #2"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

客戶

Socket socket; 
    BufferedReader in; 
    PrintWriter out; 
    String inStr; 
    try { 
     socket = new Socket("127.0.0.1", 4444); 
     out = new PrintWriter(socket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     while ((inStr = in.readLine()) != null) { 
      System.out.println(inStr); 
     } 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

它不。而他的原始代碼並沒有太大的不同。 – EJP 2011-12-19 23:24:13

+0

@EJP我在我的日食中運行相同的代碼。我在我的控制檯中獲得輸出。我首先啓動服務器,然後客戶端 – Sumit 2011-12-20 02:45:11

+0

我提到你的第一句話。 println()解決了他的問題,而不是異常處理。 – EJP 2011-12-20 03:25:56

2

您正在使用public PrintWriter(OutputStream out, boolean autoFlush)這將在新行或println自動刷新。 它在每次寫入後都不自動刷新。每次寫入後都必須刷新。

這裏是構造函數的autoFlush參數的javadoc: 一個布爾值;如果true,println,printfformat方法將刷新輸出緩衝區

+0

謝謝,但在每個println()後嘗試刷新() - 如果我用[code] inStr = in.readline()替換循環,結果相同 – Sergio 2011-12-19 23:38:46

+0

; System.out.println(inStr); inStr = in.readline(); System.out.println(inStr); [/ code]爲了從流中讀取2行 - 它工作得很好 – Sergio 2011-12-20 00:17:19

相關問題