2011-03-10 201 views
1

我正在嘗試編寫一個基本的客戶端服務器程序,以允許客戶端遍歷服務器的文件。我希望服務器在連接客戶端時將當前目錄中所有文件的列表發送給客戶端。我會如何去做這件事?我已經創建了一個包含所有文件名的數組,並且正試圖將這些文件發送給客戶端,它只是在一個無限循環中(因爲它意味着!)並且什麼都不做。如何讓服務器向客戶端發送連接消息?

試圖在服務器上的客戶端的連接發送的消息:

DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 


    boolean found = false; 

    //Read the data from the input stream 
    for (int i=0;i < fileList.length;i++) { 
     outToClient.writeBytes(fileList[i].getName()); 
    } 

並且讓服務器接收這樣的:

//Prepare an object for reading from the input stream 
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

//Read the data from the input stream 
sentence = inFromServer.readLine(); 

,但這樣做只是讓客戶靜坐在無限循環,什麼都不做。

請幫忙嗎?

回答

1

你的主要問題是你正試圖從客戶端發送一個空字符串到服務器。一個空字符串轉換爲長度爲0的字節數組。實際上,您不在客戶端和服務器之間發送任何數據。在這種情況下,您的服務器將繼續等待通過套接字的InputStream檢索數據。由於服務器仍在等待,因此不會繼續將數據發送回客戶端。因此,當客戶端嘗試從服務器偵聽數據時,它將無限期地等待,因爲服務器永遠不會到達代碼的那一部分。

如果您的目標是讓服務器在連接時簡單地發送數據,您有幾個選項。

  1. 連接後,服務器立即發送列表到客戶端。您不必在這裏進行雙向溝通。客戶端可以立即開始監聽InputStream。
  2. 讓客戶端發送至少1個字節到服務器,服務器可以通過它的InputStream檢索並繼續處理。如果你需要執行多個函數,那麼你可能想要發送一個字符串值,這意味着什麼,例如,out.write(「list」.getBytes(「UTF-8」));然後,服務器可以根據收到的值執行操作。

示例服務器:

ServerSocket socket = new ServerSocket(8888); 
Socket cSocket = socket.accept(); 

PrintWriter out = null; 
try { 
    out = new PrintWriter(new OutputStreamWriter(cSocket.getOutputStream())); 

    for (String file : new File(".").list()) { 
     out.println(file); 
    } 
} 
finally { 
    if (out != null) { 
     out.close(); 
    } 
    cSocket.close(); 
    socket.close(); 
} 

示例客戶端:

Socket s = new Socket("localhost", 8888); 
BufferedReader in = null; 

try { 
    in = new BufferedReader(new InputStreamReader(s.getInputStream())); 

    String line; 
    while ((line = in.readLine()) != null) { 
     System.out.println(line); 
    } 
} 
finally { 
    if (in != null) { 
     in.close(); 
    } 
    s.close(); 
} 
+0

我試圖讓服務器立即發送連接,但它不會工作。我將編輯我的帖子以顯示我現在正在嘗試的內容。 – 2011-03-10 15:52:36

+0

@John McCarthy - 新增示例代碼來回答。 – 2011-03-10 16:48:19

1

首先請確保您有以下客戶端和服務器之間的握手:

  1. 監聽服務器
  2. 客戶端連接
  3. 服務器接受
    現在有兩條路:
  4. 服務器監聽命令
  5. 客戶端發送命令'dir'
  6. 客戶端s撻聽
  7. 服務器發回你的清單
    備用路徑:
  8. 客戶端偵聽
  9. 服務器發送列表
  10. 服務器開始聽

...正常通信。
發送大小爲0的消息有時可能會導致問題。
所以使用查詢 - 響應方法似乎是準確的。

0

我不相信有可能有服務器發送消息給客戶端自發。發送消息「dir」並在服務器上偵聽,然後聽取客戶端並回復。

相關問題