Windows 关闭时 Java 退出

2023-11-29

我有这个代码。如果我的 Java 应用程序检测到计算机正在关闭,我想退出它。我有这个问题,如果在 Windows 上单击关闭,我的 Java 应用程序将与 Android 应用程序连接断开。我想显示java应用程序已断开连接或者它将退出。

//  Copyright 2012
//  Android Remote Desktop Server Ver. 1.0


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.Random;

public class ServerWindow implements ActionListener{

    private RemoteDataServer server;

    private Thread sThread; //server thread

    private static final int WINDOW_HEIGHT = 200;
    private static final int WINDOW_WIDTH = 350;

    private String ipAddress;

    private JFrame window = new JFrame("Remote Control for Android");

    private JLabel addressLabel = new JLabel("");
    private JLabel portLabel = new JLabel("Android Remote Control Port: ");
    private JTextArea[] buffers = new JTextArea[3];
    private JTextField portTxt = new JTextField(5);
    private JLabel serverMessages = new JLabel("Not Connected");

    private JButton connectButton = new JButton("Start Server");
    private JButton disconnectButton = new JButton("Stop Server");

    public boolean connected = false;




    //@SuppressWarnings("deprecation")
    public ServerWindow(){
        server = new RemoteDataServer();

        window.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        connectButton.addActionListener(this);
        disconnectButton.addActionListener(this);

        Container c = window.getContentPane();
        c.setLayout(new FlowLayout());

        try{
            InetAddress ip = InetAddress.getLocalHost();
            ipAddress = ip.getHostAddress();
            addressLabel.setText("Android Remote Control Server IP Address: "+ipAddress);
        }
        catch(Exception e){addressLabel.setText("IP Address Could Not be Resolved");}

        int x;
        for(x = 0; x < 3; x++){
            buffers[x] = new JTextArea("", 1, 30);
            buffers[x].setEditable(false);
            buffers[x].setBackground(window.getBackground());
        }

        portTxt.setEditable(false);
        Random portRandom = new Random();
        for (int i = 0; i < 10; i++) {

          int port = portRandom.nextInt(4998) + 1;
          int portNum = 5000+port;
          String portString = Integer.toString(portNum);
          portTxt.setText(portString);
          }

        c.add(addressLabel);
        c.add(buffers[0]);
        c.add(portLabel);
        //portTxt.setText("5444");
        c.add(portTxt);
        c.add(buffers[1]);
        c.add(connectButton);
        c.add(disconnectButton);
        c.add(buffers[2]);
        c.add(serverMessages);

        window.setLocationRelativeTo(null);
        window.setVisible(true);
        window.setResizable(false);

    }


    public void actionPerformed(ActionEvent e){
        Object src = e.getSource();

        if(src instanceof JButton){
            if((JButton)src == connectButton){
                int port = Integer.parseInt(portTxt.getText());
                runServer(port);
            }

            else if((JButton)src == disconnectButton){
                closeServer();
            }
        }
    }

    public void runServer(int port){
        if(port <= 9999){
            server.setPort(port);
            sThread = new Thread(server);
            sThread.start();
        }
        else{
            serverMessages.setText("The port Number must be less than 10000");
        }
    }

    public void closeServer(){
        serverMessages.setText("Disconnected");
        server.shutdown();
        connectButton.setEnabled(true);
    }

    public static void main(String[] args){
        new ServerWindow();
    }

    public class RemoteDataServer implements Runnable{
        int PORT;
        private DatagramSocket server;
        private byte[] buf;
        private DatagramPacket dgp;

        private String message;
        private AutoBot bot;

        public RemoteDataServer(int port){
            PORT = port;
            buf = new byte[1000];
            dgp = new DatagramPacket(buf, buf.length);
            bot = new AutoBot();
            serverMessages.setText("Not Connected");
        }

        public RemoteDataServer(){
            buf = new byte[1000];
            dgp = new DatagramPacket(buf, buf.length);
            bot = new AutoBot();
            serverMessages.setText("Not Connected");
        }

        public String getIpAddress(){
            String returnStr;
            try{
                    InetAddress ip = InetAddress.getLocalHost();
                    returnStr = ip.getCanonicalHostName();
            }
            catch(Exception e){ returnStr = new String("Could Not be Resolve Ip Address");}
            return returnStr;
        }

        public void setPort(int port){
            PORT = port;
        }

        public void shutdown(){
            try{server.close();
                serverMessages.setText("Disconnected");}
            catch(Exception e){}
        }
        public void run(){
            //boolean connected = false;
            try {InetAddress ip = InetAddress.getLocalHost(); 
                serverMessages.setText("Waiting for connection on " + ip.getCanonicalHostName());

                server = new DatagramSocket(PORT, ip);

                connected = true;
                connectButton.setEnabled(false);
            }
            catch(BindException e){ serverMessages.setText("Port "+PORT+" is already in use. Use a different Port"); }
            catch(Exception e){serverMessages.setText("Unable to connect");}

            while(connected){
                //Runtime.getRuntime().exit(0);
                // get message from sender
                try{ server.receive(dgp);

                    // translate and use the message to automate the desktop
                    message = new String(dgp.getData(), 0, dgp.getLength());
                    if (message.equals("Connectivity")){
                        //send response to confirm connectivity
                        serverMessages.setText("Trying to Connect");
                        server.send(dgp); //echo the message back
                    }else if(message.equals("Connected")){
                        server.send(dgp); //echo the message back
                    }else if(message.equals("Close")){
                        serverMessages.setText("Controller has Disconnected. Trying to reconnect."); //echo the message back
                    }else{
                        serverMessages.setText("Android Phone Connected to ARD Server");
                        bot.handleMessage(message);
                    }
                }catch(Exception e){
                    serverMessages.setText("Disconnected");
                    connected = false;}
            }

        }
    }
}

假设您要问的问题是“如何检测 Windows 何时关闭”,那么您可以这样做:

您需要一个所谓的“系统关闭挂钩”,它本质上是一个线程,每当 Java 虚拟机关闭时就会执行 run() 方法。当您的程序终止或由于系统范围的事件(例如用户注销或关闭)时,就会发生这种情况。

您需要做的就是将这段代码放在程序启动过程中的某个位置:

Runtime.getRuntime().addShutdownHook(
    new Thread(new Runnable() {
        @Override
        public void run() {
            // this is executed on shut-down. put whatever.
        }
    }));

我希望这回答了你的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 关闭时 Java 退出 的相关文章

  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • “你好,世界!”遇到了意想不到的困难

    我想学习 Clojure 我已经下载并设置了以下小工具 Clojure 1 6 0 来自官方网站 莱宁根2 4 3 来自 GitHub 的苹果酒 0 6 0 我已经成功了 现在我正在尝试打印消息 Hello World 同时从 Emacs
  • Google 日历 API - 创建活动时邀请电子邮件不会发送给与会者

    我想使用 google api 将事件添加到 google 日历 但活动创建后 邀请电子邮件不会发送到与会者电子邮件列表 这是我的代码
  • python 正则表达式仅匹配第一个实例

    我有一个 python 代码 我正在读取证书并仅匹配根证书 例如 我的证书如下 begin certificate CZImiZPyLGQBGRYFbG9jYWwxGjAYBgoJkiaJk IasdasdassZAEZFgp2aXJ0dW
  • Android:多个警报不起作用

    在我的应用程序中 我设置了两个闹钟 在 ToogleButton 上 我将使用以下代码将其设置为打开 case R id toggleButtonTwoMonth myPrefs this getSharedPreferences myPr
  • 如何在内核中放置微秒延迟?

    我想放置微秒延迟Linux kernel 哪些函数支持它 需要添加什么头文件 你最好读书Documentation timers timers howto txt在linux内核源代码中 简而言之 您可以使用msleep unsigned
  • 为什么PWA提倡添加到主屏幕但只是创建chrome快捷方式而不是安装为apk?

    我检查所有添加到主屏幕条件 我想我在我的 PWA 中提供了所有这些 当用户访问我的 PWA 迷你信息栏时 当用户单击 添加到主屏幕 时 仅将 PWA 的快捷方式添加到主屏幕 但未安装 PWA 不在应用程序列表中 并且深层链接不起作用 UPD
  • SlimDX/DirectX9/C# - 如何访问纹理中的像素数据

    这是我在 StackOverflow 上遇到的第一个问题 万岁 我可以诚实地说 我每天都使用 StackOverflow 来处理我的工作和个人编程谜题 99 9 的情况下 我实际上也在这里找到了我需要的答案 这太棒了 我当前的问题实际上让我
  • 图像处理/超轻OCR

    我有 55 000 个图像文件 JPG 和 TIFF 格式 它们是书中的图片 每个页面的结构是这样的 一些文字 水平线 a number 一些文字 水平线 另一个号码 一些文字 任何给定页面上可以有 0 到 4 条水平线 我需要找到水平线下
  • 将 ASPX 导出为 HTML

    我们正在构建一个 CMS 该网站将由用户在 aspx 页面中构建和管理 但我们希望创建一个 HTML 的静态网站 我们现在的做法是使用我找到的代码here重载 Aspx 页面中的 Render 方法并将 HTML 字符串写入文件 这对于单个
  • Mayavi 纹理覆盖整个表面

    我想做类似的事情 使用 python 和 Mayavi2 进行 3D 地形可视化 作为输入 我有一个图像 地图 其宽度和高度以像素为单位定义 对于此图像 地图 我获得了图像 地图所代表的表面 范围 的数字高程模型 范围由最小 最大经度和纬度
  • 在Python中设置函数签名

    假设我有一个通用函数f 我想要以编程方式创建一个函数f2其行为与f 但有一个定制的签名 更多详情 给定一个列表l和 字典d我希望能够 设置非关键字参数f2到字符串中l 设置关键字参数f2到按键d和默认值的值d IE 假设我们有 l x y
  • 如何添加Access-Control-Allow-Origin?

    当我调用我的 webservice 方法时 出现以下错误 Origin http localhost 4165 is not allowed by Access Control Allow Origin 当参考网络时 我得到了像 add 这
  • 如何检索通过 insert...select 插入的行的标识?

    我正在通过类似于此的查询插入记录 insert into tbl xyz select field1 from tbl abc 现在我想检索插入记录的新生成的 IDENTITY 值 如何以最少的锁定量和最大的可靠性来做到这一点 您可以使用以
  • 如何在 Ajax 调用期间用加载图像替换 TD 内的图像

    我有一个 HTML 表格 每个单元格中都有一个图像 后面跟着一些文本 像这样的事情 td img src image gif This is a test td 我必须运行 jQuery Ajax 调用 在此调用期间 我想将图像更改为我拥有
  • 文件输入为空,但 Request.Files 中显示空“文件”

    我有一个具有以下文件输入的视图
  • 为什么 scanf 不需要字符串的 & 符号并且在 printf (C 语言)中也能正常工作?

    我现在正在学习C语言中的字符串 如何使用 scanf 来获取字符串你可以这样做 scanf s str1 对于 printf 你可以做 printf The string is s n str1 我知道对于 scanf 来说 这是因为字符串
  • 如何同步两个具有相同结构和不同服务器的MySQL表

    我有两台ubuntu服务器 并安装了Mysql 4 0 ServerA和ServerB 我想将ServerA的mysql表同步到ServerB 将ServerATable复制到ServerBTable 保持ServerATable和Serv
  • 主键违规:使用 EF Code First 进行继承

    我有以下 EF 代码第一个代码 我收到以下异常 GiftCouponPayment 不包含标识列 表已在数据库中成功创建 然而 我怎样才能摆脱这个异常呢 另外 这个异常的原因是什么 注意 只要保留域模型 首先使用代码描述 并且可以查询数据
  • Neo4j 空间密码查询 insideDistance 不返回现有节点

    我正在使用 Neo4j 2 0 的空间服务器插件 并遵循以下指南http neo4j github io spatial 添加名为 Stockholm 的节点 POST http localhost 7475 db data ext Spa
  • Windows 关闭时 Java 退出

    我有这个代码 如果我的 Java 应用程序检测到计算机正在关闭 我想退出它 我有这个问题 如果在 Windows 上单击关闭 我的 Java 应用程序将与 Android 应用程序连接断开 我想显示java应用程序已断开连接或者它将退出 C