【问题标题】:Return value after event or timeout事件或超时后的返回值
【发布时间】:2015-05-05 15:40:53
【问题描述】:

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

【问题讨论】:

  • 那么......如果它不能正常工作,它在做什么?
  • 如果服务器响应到达,我不知道如何返回 true 或 false,如果超时发生在之前(在 login(...) 中),我不知道如何返回 false
  • 在您开始等待之前,您需要启动一个计时器,或安排任务,如果您收到响应,您将取消它。如果您不取消启动,您可以关闭连接,这将唤醒等待的线程。

标签: java multithreading architecture return


【解决方案1】:

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

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

与套接字打开超时相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多