我创建了一个服务器客户端项目,服务器在其中不断侦听并打印信息。但是,当我关闭客户端时,服务器保持打开状态。问题是我需要将其插入另一个应用程序,并且,如果服务器一开始没有关闭,则除非我终止该端口中的进程,否则该应用程序将不会打开(但这对我来说不是一个选项(。客户端断开连接后,我应该怎么做才能正确关闭服务器?
这是代码:
服务器:
public class Server {
public static void main(String[] args) {
Connection conn = new Connection();
new Thread(conn).start();
}
private static class Connection implements Runnable {
@Override
public void run() {
try (ServerSocket serverSocket = new ServerSocket(5005)) {
Socket socket = serverSocket.accept();
listener(socket);
} catch (IOException ex) {
ex.printStackTrace();
}
}
private void listener(Socket socket) throws IOException {
DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
boolean alive = true;
while (alive) {
try {
outputStream.writeUTF(new Scanner(System.in).nextLine());
System.out.println(inputStream.readUTF());
} catch (IOException ex) {
ex.printStackTrace();
alive = false;
}
}
}
}
}
客户:
public class Client {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 5005)) {
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
while (socket.isConnected()) {
System.out.println("Incoming data: " + inputStream.readUTF());
outputStream.writeUTF(new Scanner(System.in).nextLine());
outputStream.flush();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
从现在开始,非常感谢!
强制系统等待而不关闭的是服务器上的这一行.java :
outputStream.writeUTF(new Scanner(System.in).nextLine());
一旦它开始等待用户输入,它就会在实例的生命周期内永远等待,尽管您的客户端已断开连接。
那你能做什么呢?您可以创建另一个线程,该线程进行定期"ENTER"输入(如果您坚持使用新的 Scanner(System.in((,例如每 5 秒输入一次。输入或任何其他有意义的输入后,如果您确定这不是来自客户端,请不要将其写入客户端并再次等待用户输入(如果您的客户端仍然连接!如果您的客户端未连接,只需完成循环即可。
请检查 Java 机器人类和此示例