在动作侦听器更改的条件下中断while循环

时间:2015-12-13 19:01:16

标签: java sockets while-loop actionlistener break

我用Java制作了一个服务器并为它实现了一个GUI。在GUI上有两个按钮 - '允许'并且'拒绝'连接。何时允许'点击了boolen值' AllowConnections'设置为true并拒绝'拒绝'它设置为false。

基本上,程序将初始化gui和actionlisteners,如果AllowConnections为true,则将打开套接字并允许客户端连接到它。我希望能够点击“拒绝”#39;它将用户从插座中踢​​出问题是我无法摆脱不断获取传入消息的循环,因为它会暂停并等待用户连接或用户发送消息。如下所示:

服务器类:

boolean loop = true;

while (loop) {

    if (allowConnections == true) {
        remote.commands();
    }
    else {
        System.out.println("reject");
    }

}

远程课程:

public static void commands() {

    try {

        serverSocket = new ServerSocket(serverPort);
        System.out.println("open");

        Socket clientSocket = serverSocket.accept();
        connected = true;

        System.out.println("connected");
        BufferedReader clientMessage = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

        String input;

        while (connected) {

            input = clientMessage.readLine();
            System.out.println(input);

            // do commands

        }

    }

    catch (IOException e) {
        e.printStackTrace();
    }

}

在上面的代码中,程序将暂停并等待用户连接(第8行)并等待用户发送消息(第18行),这意味着我不能只放一个if(!allowConnections) {break;}条件语句来打破循环。

关于如何在条件发生变化时打破这个循环的任何想法(有点像一个不断检查条件的while循环)或者我如何重写它以包含我需要的功能?

2 个答案:

答案 0 :(得分:1)

make allowConnections static 和public(或使用getter),然后你可以在 commands()方法中查看它。

编辑:启动一个新线程,检查 allowConnections 是否已更改,并在更改状态时调用_ serverSocket.close()_。

答案 1 :(得分:1)

ServerSocket方法setSoTimeouthttps://docs.oracle.com/javase/7/docs/api/java/net/ServerSocket.html#setSoTimeout(int)

这可以用来避免accept阻止无限。正如文档所述,如果在没有连接的情况下传递时间,则会抛出java.net.SocketTimeoutException