2009-11-30 112 views
2

我正在嘗試爲一項任務編寫客戶端和時間服務器,並且無法讓服務器接收來自客戶端的第二個請求。第一個請求順利完成。那麼它就會失速。我其實完全迷失在這整件事情中,而對java仍然感到不舒服,所以我不知道我錯過了什麼。任何指針都非常感謝。謝謝!Java服務器客戶端|服務器將不會收到第二個請求

這裏的服務器代碼:

import java.io.*; 
import java.util.*; 
import java.net.*; 
import java.text.*; 

public class myServer { 

     protected static final int PORT_NUMBER = 55555; 

     public static void main(String args[]) { 

     try { 

      ServerSocket servsock = new ServerSocket(PORT_NUMBER); 

      System.out.println("Server running..."); 

      while(true) { 

       Socket sock = servsock.accept(); 

       System.out.println("Connection from: " + sock.getInetAddress()); 

       Scanner in = new Scanner(sock.getInputStream()); 
       PrintWriter out = new PrintWriter(sock.getOutputStream()); 
       String request = ""; 

       request = in.next(); 

       System.out.println("Request: " + request); 

       if(request.toUpperCase().equals("TIME")) { 
        out.println(getTime()); 
        out.flush(); 
       } else { 
        out.println("Invalid Request..."); 
        out.flush(); 
       } 

      } 

     } catch(Exception e) { 
      System.out.println(e.toString()); 
     } 

    } 

     protected static String getTime() { 
      DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 
      Date date = new Date(); 
      return (dateFormat.format(date)); 
     } 

} 

這裏的客戶:

import java.io.*; 
import java.util.*; 
import java.net.*; 

public class myClient { 

     protected static final String HOST = "127.0.0.1"; 
     protected static final int PORT = 55555; 

     protected static Socket sock; 

     public static void main(String args[]) { 

     try { 

       sock = new Socket(HOST,PORT); 

       System.out.println("Connected to " + HOST + " on port " + PORT); 

       Scanner response = new Scanner(sock.getInputStream()); 
       PrintWriter request = new PrintWriter(sock.getOutputStream()); 
       BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
       String txt = ""; 

       while(!txt.toUpperCase().equals("EXIT")) { 

        System.out.print("prompt:"); 
        txt = in.readLine(); 

        request.println(txt); 
        request.flush(); 

        System.out.println(response.next()); 

       } 

       request.close(); 
       response.close(); 
       in.close(); 
       sock.close(); 

      } catch(IOException e) { 
       System.out.println(e.toString()); 
      } 
     } 

} 

回答

4

你需要有另一個while循環,這樣的事情,

while(true) {     
     Socket sock = servsock.accept();     
     System.out.println("Connection from: " + sock.getInetAddress());     
     Scanner in = new Scanner(sock.getInputStream());     
     PrintWriter out = new PrintWriter(sock.getOutputStream());     
     String request = "";     
     while (in.hasNext()) { 
      request = in.next();     
      System.out.println("Request: " + request);     
      if(request.toUpperCase().equals("TIME")) {      
       out.println(getTime()); 
       out.flush();     
      } else { 
       out.println("Invalid Request...");      
       out.flush(); 
      } 
     } 
} 
+1

非常感謝!我現在一直在爲此拋出這麼長時間。我不知道爲什麼我沒有看到它,但謝謝! – seventeen

+0

謝謝你拯救我的一天:) – koutuk

2

PrintWriterdocs

...如果啓用自動刷新,一定會完成只有當其中一個println,printf或調用10種方法...

您的服務器正在調用print()並且從不刷新流,所以時間永遠不會被髮送。請致電println()或顯式刷新流。

而且,服務器發送的時間後立即關閉連接,所以客戶端的第二個請求總是失敗......

編輯:這裏有一個有趣的怪癖 - 關閉PrintWriter應該刷新它(見Writer規範),但由於操作的順序是什麼似乎發生的卻是:

  1. in.close()關閉底層Socket
  2. out.close()刷新寫入的數據,但不能(因爲插座現已關閉)

不知道這到底是什麼回事,但交換這兩個語句的順序改變了行爲,想必讓out.close()有機會刷新......

+0

謝謝,我查幾件事情,我終於有了兩個溝通。但是,它仍然不接受第二次請求。我將問題中的代碼更新爲當前版本。有任何想法嗎? – seventeen

+0

讀完第一個請求後,服務器只是拋出連接並再次調用'servsock.accept()',導致它等待* new *客戶端連接。 – SimonJ

相關問題