我用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循环)或者我如何重写它以包含我需要的功能?
答案 0 :(得分:1)
make allowConnections static 和public(或使用getter),然后你可以在 commands()方法中查看它。
编辑:启动一个新线程,检查 allowConnections 是否已更改,并在更改状态时调用_ serverSocket.close()_。
答案 1 :(得分:1)
ServerSocket
方法setSoTimeout
:https://docs.oracle.com/javase/7/docs/api/java/net/ServerSocket.html#setSoTimeout(int)
这可以用来避免accept
阻止无限。正如文档所述,如果在没有连接的情况下传递时间,则会抛出java.net.SocketTimeoutException