2013-11-03 45 views
0

我正在嘗試創建文件共享Java應用程序。 我正在做兩個獨立的項目,服務器和客戶端。服務器端存儲了文件,客戶端可能會請求從服務器下載文件,或將文件上傳到服務器,或者從服務器檢索文件列表。從服務器檢索字符串

我在從服務器檢索文件時遇到問題。我做了一個方法來檢索文件,但是當方法運行時,程序掛起,沒有任何響應。

這裏是我的檢索文件中的代碼(客戶端,很明顯):

public void retrieveFileData() throws IOException { 
    Socket theSocket = new Socket(this.theHostIP, this.portNumber); 
    PrintWriter messageWriter = new PrintWriter(theSocket.getOutputStream(), 
      true); 
    messageWriter.write("REFRESH"); 
    BufferedReader filesReader = new BufferedReader(new InputStreamReader(
      theSocket.getInputStream())); 
    this.retrievedFiles = filesReader.readLine(); 
    theSocket.close(); 
} 

下面是服務器端的代碼:

ServerSocket theServerSocket = new ServerSocket(this.portNumber); 
Socket theClientSocket = theServerSocket.accept(); 
BufferedReader inputReader = new BufferedReader(new InputStreamReader(
      theClientSocket.getInputStream())); 
PrintWriter outputWriter = new PrintWriter(
      theClientSocket.getOutputStream(), true); 
String line = inputReader.readLine(); 

while (true) { 
    if (line.startsWith("REFRESH")) { 
System.out.println("received refresh request..."); 
outputWriter.write(this.filesToSend); 
} 

所以,基本上,客戶端發送一個簡單的消息告訴服務器它想要什麼(在這種情況下,「REFRESH」來檢索文件列表),服務器應該使用其輸出寫入器將其提供給客戶端。

我在做什麼錯?我懷疑問題出在客戶端,因爲「接收到刷新請求...」不能在控制檯中打印。

謝謝。

回答

1

我認爲這是因爲PrintWriter messageWriter沒有刷新。 我會嘗試。

messageWriter.println("REFRESH"); 
messageWriter.flush(); 
+0

我想的PrintWriter outputWriter =新的PrintWriter( theClientSocket.getOutputStream(),TRUE);此聲明使PrintWriter自動刷新。我看到這是不正確的。非常感謝。 –

+0

好的。這是真的,但那麼你應該println,以便它創建一個換行符。或者寫入(「REFRESH \ n」);也會有效。請參閱javadoc「autoFlush - 布爾值;如果爲true,則println,printf或format方法將刷新輸出緩衝區」。所以當你使用簡單的寫法時不行。 – Wouter