我想将包含登录凭据的字符串发送到远程主机。服务器应在短时间后发回"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);
}
// ...
}
答案 0 :(得分:0)
设置超时: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setSoTimeout(int)
读取将仅阻塞一段时间,然后引发sockettimeoutexception。在sockettimeout的catch块中,返回false。
这不与套接字打开超时相同。