【发布时间】:2015-05-05 15:40:53
【问题描述】:
我想向远程主机发送一个包含登录凭据的字符串。服务器应在短时间内发回"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);
}
// ...
}
【问题讨论】:
-
那么......如果它不能正常工作,它在做什么?
-
如果服务器响应到达,我不知道如何返回 true 或 false,如果超时发生在之前(在 login(...) 中),我不知道如何返回 false
-
在您开始等待之前,您需要启动一个计时器,或安排任务,如果您收到响应,您将取消它。如果您不取消启动,您可以关闭连接,这将唤醒等待的线程。
标签: java multithreading architecture return