2012-10-20 45 views
1

我有這段代碼。如果檢測到計算機正在關閉,我想退出Java應用程序。我有這個問題,如果在Windows上單擊關閉我的Java應用程序斷開連接android應用程序。我想顯示java應用程序已斷開連接,否則它將退出。Java關閉Windows關機

// 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;} 
      } 

     } 
    } 
} 
+2

這就是你發佈的很多代碼。你確定這一切是相關的嗎? – Kierrow

+1

我的理解在這裏是否正確,您是否想要在Windows使用Java關閉時檢測? – Kierrow

回答

7

假設你的意思是要問的問題是「如何檢測時被關閉Windows」,這裏是你如何做到這一點:

你需要一個所謂的「系統關機掛鉤」 ,它本質上是一個Thread的run()方法,只要Java虛擬機關閉就執行。當程序終止或系統範圍的事件(例如用戶註銷或關機)時,會發生這種情況。

所有你需要做的就是把這段代碼在某處你的程序的啓動過程:

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

我希望這回答了你的問題。

+0

謝謝先生,但我真的不知道該把代碼放在哪裏。我只是Android編程的初學者。你能指定哪部分程序將我的代碼放在哪裏?先生非常感謝您。 –

+0

@ user1753530就像我說的,你需要把它放在初始化階段的某個地方。由於您在Windows關閉時想要執行的操作需要開放的網絡連接(據我所知),您應該在設置服務器之後立即將該代碼放入(我相信在服務器=新的RemoteDataServer();'是適當的)。在那個'run()'方法中,你可以調用你的關閉腳本。 – Kierrow

+0

如果關閉已啓動,則服務器窗口未響應,然後取消。我需要在Windows強制關閉之前至少退出我的Java程序。它有「應用程序防止從窗口關閉」警報。請幫幫我。我需要一個代碼。謝謝 –