0
我想將包含登錄憑證的字符串發送到遠程主機。服務器應在短時間後發回"LOGIN ACCEPTED"
或"LOGIN DENIED"
。如果發生這種情況,我想返回true
或false
。如果在給定的超時時間內沒有收到回覆,我想返回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);
}
// ...
}
所以......如果它不能正常工作,它在做什麼? – Thomas
我不知道如何返回true或false如果服務器響應到達或假如超時發生之前(在登錄(...)) –
開始等待之前您需要啓動計時器或計劃任務,如果你會得到一個回覆,你取消它。如果你不取消開始,你可以關閉連接,這會喚醒等待的線程。 –