2014-02-19 53 views
2

我在java中運行一個使用SwingWorker類的tcp服務器。第一次它會開始成功,但是當我停下來並開始這個過程時,它將無法工作。我找不到什麼漏洞,請幫我解決這個我無法停止Java SwingWorker進程

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class SwingWorkerDemo extends JFrame { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private static ServerSocket serverSocket; 
     private static Socket clientSocket; 
     private static InputStreamReader inputStreamReader; 
     private static BufferedReader bufferedReader; 
     private static String message; 

    public SwingWorkerDemo() { 
     initialize(); 
    } 

    private void initialize() { 
     this.setLayout(new FlowLayout()); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final JButton startButton = new JButton("Start"); 
     final JButton stopButton = new JButton("Stop"); 
     final LongRunProcess process = new LongRunProcess(); 



     startButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent event) { 
       try { 
        process.execute(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       startButton.setEnabled(false); 
       stopButton.setEnabled(true); 
      } 
     }); 

     stopButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       // JOptionPane.showMessageDialog(null, "Hello There"); 

process.cancel(true); 
startButton.setEnabled(true); 
stopButton.setEnabled(false); 
      } 
     }); 


     this.getContentPane().add(startButton); 
     this.getContentPane().add(stopButton); 

     this.pack(); 
     this.setSize(new Dimension(300, 80)); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new SwingWorkerDemo().setVisible(true); 
      } 
     }); 
    } 

    class LongRunProcess extends SwingWorker { 
     /** 
     * @throws Exception 
     */ 
     protected Object doInBackground() throws Exception { 
      try { 
       serverSocket = new ServerSocket(4545); //Server socket 

      } catch (IOException e) { 
       System.out.println("Could not listen on port: 4545"); 
      } 

      System.out.println("Server started. Listening to the port 4545"); 

      while (true) { 
       try { 

        clientSocket = serverSocket.accept(); //accept the client connection 
        inputStreamReader = new InputStreamReader(clientSocket.getInputStream()); 
        bufferedReader = new BufferedReader(inputStreamReader); //get the client message 
        message = bufferedReader.readLine(); 
    if(message.equals("shutdown")){ 

    Runtime runtime = Runtime.getRuntime(); 
    Process proc = runtime.exec("shutdown -s -t 00"); 
    System.exit(0); 

    } 
    else if(message.equals("restart")){ 
    Runtime runtime1 = Runtime.getRuntime(); 
    Process proc2 = runtime1.exec("shutdown -r -t 00"); 
    System.exit(0); 


    } 

        System.out.println(message); 
        inputStreamReader.close(); 
        clientSocket.close(); 

       } catch (IOException ex) { 
        System.out.println("Problem in message reading"); 
       } 
      } 

    } 
    } 
} 
+0

我看不到任何關閉服務器套接字嘗試的跟蹤。 –

+0

我如何阻止它從UI線程? –

+0

您是否已經嘗試調用'.close()'? –

回答

1

您可以使用它。在此我也做了一些更改

public class Test extends JFrame { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private static ServerSocket serverSocket; 
    private static Socket clientSocket; 
    private static InputStreamReader inputStreamReader; 
    private static BufferedReader bufferedReader; 
    private static String message; 

    public Test() { 
     initialize(); 
    } 

    LongRunProcess process; 

    private void initialize() { 
     this.setLayout(new FlowLayout()); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final JButton startButton = new JButton("Start"); 
     final JButton stopButton = new JButton("Stop"); 

     startButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent event) { 
       try { 
        process = new LongRunProcess(); 
        process.start(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       startButton.setEnabled(false); 
       stopButton.setEnabled(true); 
      } 
     }); 

     stopButton.addActionListener(new ActionListener() { 
      @SuppressWarnings("deprecation") 
      public void actionPerformed(ActionEvent e) { 
       // JOptionPane.showMessageDialog(null, "Hello There"); 

       process.closeServer(); 

       startButton.setEnabled(true); 
       stopButton.setEnabled(false); 
       process.stop(); 
      } 
     }); 

     this.getContentPane().add(startButton); 
     this.getContentPane().add(stopButton); 

     this.pack(); 
     this.setSize(new Dimension(300, 80)); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Test().setVisible(true); 
      } 
     }); 
    } 

    class LongRunProcess extends Thread { 
     /** 
     * @throws Exception 
     */ 
     public void closeServer() { 
      try { 
       serverSocket.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      System.out.println("Closed Now"); 
     } 

     public void run() { 
      try { 
       serverSocket = new ServerSocket(4545); // Server socket 

      } catch (IOException e) { 
       System.out.println("Could not listen on port: 4545"); 
      } 

      System.out.println("Server started. Listening to the port 4545"); 

      while (!(serverSocket.isClosed())) { 
       try { 

        clientSocket = serverSocket.accept(); // accept the client 
                  // connection 
        inputStreamReader = new InputStreamReader(
          clientSocket.getInputStream()); 
        bufferedReader = new BufferedReader(inputStreamReader); // get 
                      // the 
                      // client 
                      // message 
        message = bufferedReader.readLine(); 
        if (message.equals("shutdown")) { 

         Runtime runtime = Runtime.getRuntime(); 
         Process proc = runtime.exec("shutdown -s -t 00"); 
         System.exit(0); 

        } else if (message.equals("restart")) { 
         Runtime runtime1 = Runtime.getRuntime(); 
         Process proc2 = runtime1.exec("shutdown -r -t 00"); 
         System.exit(0); 

        } 

        System.out.println(message); 
        inputStreamReader.close(); 
        clientSocket.close(); 

       } catch (IOException ex) { 
        System.out.println("Problem in message reading"); 
       } 
      } 
     } 
    } 
} 
+0

謝謝你現在的工作.... –

3

按的Javadoc的SwingWorker#execute()

注:SwingWorker的被設計爲只執行一次。多次執行一個 SwingWorker不會導致兩次調用doInBackground方法 。

因此您看到的行爲。所以爲了達到你的目標。每次按下開始按鈕時都需要創建LongRunProcess的新實例。像這樣的東西。

在申報一流水平

LongRunProcess process = null; 

修改的動作監聽

startButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent event) { 
      try { 
       process = new LongRunProcess(); 
       process.execute(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      startButton.setEnabled(false); 
      stopButton.setEnabled(true); 
     } 
    }); 

希望這有助於。

+0

我不是想以串行方式執行它,我只是想啓動 - 停止程序,所以通常只有一個swingworker正在運行 –

+0

是的,但是你只是在intialize方法中創建一次LongRunProcess實例,所以你試圖重新啓動它,一次又一次使用相同的實例。您必須在按下開始按鈕後創建一個LongRunProcess的新實例。 – Sanjeev

+0

但我如何停止當前正在運行的過程還關閉打開的端口,否則它會拋出異常端口正在使用 –