Windows关闭时的Java退出

我有这个代码。 如果检测到计算机正在关闭,我想退出我的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. } })); 

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