2015-05-05 96 views
0

我想將包含登錄憑證的字符串發送到遠程主機。服務器應在短時間後發回"LOGIN ACCEPTED""LOGIN DENIED"。如果發生這種情況,我想返回truefalse。如果在給定的超時時間內沒有收到回覆,我想返回false事件或超時後的返回值

不幸的是,我不知道如何做到這一點。

這是一個實驗性項目,因此登錄憑證的傳輸不安全並不重要。

相關代碼:

public class Client implements Closeable, DataSender { 
    protected RequestHandler requestHandler; 
    protected Thread clientThread; 
    protected PrintWriter printWriter; 

    public final int LOGIN_TIMEOUT = 5000; 

    public Client(InetAddress address, RequestHandler requestHandler) { 
     this.requestHandler = requestHandler; 
     // ... 
      this.startListening(); 
     // ... 

    } 

    protected void startListening() { 
     this.clientThread = new Thread(() -> { 
      try { 
       Scanner scanner = new Scanner(this.socket.getInputStream(), StandardCharsets.UTF_8.name()); 
       this.printWriter = new PrintWriter(new OutputStreamWriter(this.socket.getOutputStream(), StandardCharsets.UTF_8.name())); 
       String line; 
       while (this.running) { 
        line = scanner.nextLine(); 

        switch (line) { 
         case "LOGIN ACCEPTED": 
          // TODO 
          break; 

         case "LOGIN DENIED": 
          // TODO 
          break; 
         // ... 
        } 
       } 
      } catch (IOException e) { 
       System.err.println("Cannot connect to server."); 
       e.printStackTrace(); 
      } 
     }); 
     this.clientThread.setDaemon(true); 
     this.clientThread.run(); 
    } 

    public boolean login(String user, String password) { 
     String data = "LOGIN\nuser=" + user + "\n+password=" + password; 
     this.send(data); 

     // TODO 

     return false; 
    } 

    protected void send(String data) { 
     this.printWriter.write(data); 
    } 
    // ... 
} 
+0

所以......如果它不能正常工作,它在做什麼? – Thomas

+0

我不知道如何返回true或false如果服務器響應到達或假如超時發生之前(在登錄(...)) –

+3

開始等待之前您需要啓動計時器或計劃任務,如果你會得到一個回覆​​,你取消它。如果你不取消開始,你可以關閉連接,這會喚醒等待的線程。 –

回答