2012-07-21 103 views
1

我有一個基本的服務器和用Java編寫的客戶端。這是我在互聯網上看到的代碼,並進行了一些修改以適應我的需求。現在的事情是,我基本上是從客戶端發送消息到服務器。這條消息將是「你好」。服務器檢查端口6789是否有包含單詞「hello」的消息,如果是,則必須獲取某個目錄中所有文件/子目錄的名稱。這些名字中的第一個被髮送回客戶端,客戶端將其打印出來。我已經打開了端口6789,並將消息從客戶端發送到服務器完美地工作。服務器收到它並執行必要的操作,但不會將數據發送回客戶端。我不知道客戶端是否沒有收到它,或者服務器是否沒有發送它。這裏有兩個代碼:簡單的Java服務器/客戶端不工作?

客戶

String sentence = "hello"; 
    Socket clientSocket = new Socket("localhost", 6789); 
    DataOutputStream outToServer = new DataOutputStream(
      clientSocket.getOutputStream()); 
    outToServer.writeBytes(sentence + '\n'); 
    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
      clientSocket.getInputStream())); 
    System.out.println(inFromServer.readLine()); 
    clientSocket.close(); 

服務器

String sentence; 
    ServerSocket welcomeSocket = new ServerSocket(6789); 

    while (true) { 
     Socket connSocket = welcomeSocket.accept(); 
     BufferedReader inFromClient = new BufferedReader(
       new InputStreamReader(connSocket.getInputStream())); 
     sentence = inFromClient.readLine(); 
     if (sentence.contains("hello")) { 
      File dir = new File("D:/ServerMap/"); 
      String[] children = dir.list(); 
      if (children == null) { 
       JOptionPane.showMessageDialog(frame, 
         "Either no directory or it doesn't exist"); 
      } else { 
       DataOutputStream outToClient = new DataOutputStream(
         connSocket.getOutputStream()); 
       outToClient.writeBytes(children[0]); 
       JOptionPane.showMessageDialog(frame, children[0]); 
      } 
     } 
    } 

我通過單獨導出運行的JAR文件執行服務器和客戶端被編譯並在Eclipse中運行。

只是爲了澄清我的問題:客戶端向服務器發送「hello」 - >服務器接收到消息並且它包含「hello」,因此if-statement返回true - >服務器檢查指定目錄中的文件名並找到一對 - >服務器發回它找到的第一個文件名 - >客戶端應該接收文件的名稱和它在Eclipse控制檯打印(這是行不通的部分)

有什麼建議?

PS:這是在本地主機上全部完成。它在1臺計算機上完成,Windows 7 x64,端口6789已打開(在我手動打開它之前根本沒有任何工作),這就是它。

回答

3

您應該清空從客戶端的輸出流中的數據在服務器:

outToClient.writeBytes(children[0] + "\n"); 
outToClient.flush(); 
// etc. 
+2

還,服務器需要一個換行符添加到寫調用,因爲客戶端調用'readLine'。 – jtahlborn 2012-07-21 13:54:08

+0

的確,在測試中實際上沒有換行符 – Reimeus 2012-07-21 13:58:06

0

的問題是,你的客戶正在等待一個換行符「\ n」是服務器不發送。在客戶端,你有inFromServer.readLine(),並在服務器端,您有outToClient.writeBytes(兒童[0]),所以你必須將其更改爲outToClient.writeBytes(兒童[0] +「\ n」)由建議Reimeus。來自BufferedReader類的readLine方法阻塞,直到它讀取「\ n」。

相關問題