如何关闭锁定在无限循环中的套接字



我创建了一个服务器客户端项目,服务器在其中不断侦听并打印信息。但是,当我关闭客户端时,服务器保持打开状态。问题是我需要将其插入另一个应用程序,并且,如果服务器一开始没有关闭,则除非我终止该端口中的进程,否则该应用程序将不会打开(但这对我来说不是一个选项(。客户端断开连接后,我应该怎么做才能正确关闭服务器?

这是代码:

服务器:

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 机器人类和此示例

最新更新