事件或超时后返回值

时间:2015-05-05 15:40:54

标签: java multithreading architecture return

我想将包含登录凭据的字符串发送到远程主机。服务器应在短时间后发回"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);
    }
    // ...
}

1 个答案:

答案 0 :(得分:0)

设置超时: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setSoTimeout(int)

读取将仅阻塞一段时间,然后引发sockettimeoutexception。在sockettimeout的catch块中,返回false。

与套接字打开超时相同。