2012-11-02 41 views
1

我有这整个代码。我的应用程序在Windows强制关机后挂机,然后取消。Java应用程序挂在Windows关机

application running... >> windows force shutdown >> cancel >> back to windows (application HANGS Up)

它的一个java的bug。我想在挂断之前或窗口关闭之前退出我的应用程序。

感谢

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; 

    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(){ 
      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){ 
       // 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;} 
      } 

     } 

    } 
    } 
+0

嗯,我认为这有更多与JVM,比你的代码。也许有人可以说明JVM在被告知关闭时调用的方法。 – thatidiotguy

+0

“挂断”是什么意思?你能澄清你的帖子吗? – GraphicsMuncher

+2

http://stackoverflow.com/questions/512555/detect-windows-logout-in-java –

回答

1

无需花费太多的时间来检查你的代码(说实话)刚刚从它给我的印象是你的插座I/O线程的投诉。
你不能打断它,它仍然在睡觉。
在你的情况下,你应该强制关闭网络代码中关闭钩子的输出/输入流。另一种办法是尽量让你的线程守护进程

+0

。我是一个begginer在这个。谢谢 –

+0

@ hybrid_18:检查答案在这里,看看它是否可以帮助你:http://stackoverflow.com/questions/12230629/java-how-do-i-catch-interruptedexception-on-a-thread-when-interupted-通过-anothe/12230729#12230729 – Cratylus

0

这修复它为我:

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
    public void run() { 
     // your shutdown code 

     // if you really want to be sure the program exits 
     Runtime.getRuntime().halt(0); 
    } 
}, "shutdown hook thread"));