2016-09-05 53 views
1

在下面的代碼中,我試圖啓動和停止服務器上的按鈕使用java applet.Start工作良好使用線程,但我想停止按鈕上的服務器。我已經使用揮發性 variable.Still我沒有得到服務器停止..線程不停止使用標誌作爲易失性

這裏是代碼:

public class TCPServer extends Thread { 
    public static final int SERVERPORT = 8002; 
    private boolean running = false; 
    public volatile boolean stop = false; 
    public Socket client = null; 

    public static void main(String[] args) { 
     ServerBoard frame = new ServerBoard(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public void run() { 
     super.run(); 
     running = true; 
     try { 
      System.out.println("Server Has Started........ \n Waiting for client........"); 
      ServerSocket serverSocket = new ServerSocket(SERVERPORT); 
      try { 
       while (!stop && running) { 
        client = serverSocket.accept(); 
        System.out.println("Connection Accepted......"); 
        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
        String usercmnd = in.readLine(); 
        if (usercmnd != null) { 
         Runtime runtime = Runtime.getRuntime(); 
         Process p = runtime.exec(usercmnd); 
        } 
       } 
       if (stop) { 
        serverSocket.close(); 
        client.close(); 
        System.out.println("Server Has Stopped"); 
        System.exit(0); 
       } 

      } catch (Exception e) { 
       System.out.println("Error"); 
       e.printStackTrace(); 
      } 
     } catch (Exception e) { 
      System.out.println("Error"); 
      e.printStackTrace(); 
     } 

    } 

    public void requestStop() { 
     stop = true; 
    } 
} 

但每當我點擊停止按鈕,將停止沒有表現出任何的server.Its在控制檯輸出如我所料由code.Its也沒有表現出任何錯誤 這裏是停止按鈕的代碼

stopServer = new JButton("Stop"); 
stopServer.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     stopServer.setEnabled(false); 
     startServer.setEnabled(true); 
     mServer = new TCPServer(); 
     mServer.requestStop(); 

    } 
}); 
+1

我猜想它不會停止,因爲'serverSocket.accept()'阻塞。嘗試在'requestStop'中關閉'serverSocket'。 –

+0

'stop'和'running'有什麼區別? –

+0

@AndyTurner其顯示SocketException:套接字關閉, –

回答

4

,因爲你停止它之前創建一個新的實例它不會停下來,你不甚至首先啓動它,而您應該在當前的TCPServer實例上調用requestStop()

// Here you create a new instance instead of using the existing one 
mServer = new TCPServer(); 
mServer.requestStop(); 
+0

'public void requestStop(){ \t \t stop = true; \t \t System.out.println(「Server Has Stopped」); \t \t System.exit(0); \t \t \t}''''''''''''''''''我也用過這個, –

0
在停止按鈕的ActionListener的實現

,您正在訪問TCPSERVER的不同實例(如你正在創建一個新的)。因此,將值「Stop」設置爲第二個對象。它對使用開始按鈕創建的第一個實例沒有影響。

嘗試在兩個按鈕的動作偵聽器的實現之外實例化TCServer,併爲兩者使用該單個實例。

0

由於https://docs.oracle.com/javase/7/docs/api/java/net/ServerSocket.html#accept()

ServerSocket::accept是一個阻塞的方法,所以stop變量只能成功的連接之間進行檢查。

您可以設置使用ServerSocket::setSoTimeout一個ServerSocket超時(並趕上SocketTimeoutException),或interrupt Server線程,趕上InterruptedException

這兩個例外都將從ServerSocket::accept丟棄。

請注意,線程中斷在超時和重複異常捕獲方面非常受歡迎。

0

試試這個:

public void requestStop() { 
    stop = true; 
    interrupt(); 
} 

然而,在這種情況下,我們不能保證,已經處理邏輯會成功關閉。

此外,您嘗試爲TCPServer的新實例調用requestStop,而不是已經存在的。

0

您的代碼client = serverSocket.accept();被阻止。所以一旦你點擊了「stopServer」按鈕,你就要求停止,但是隻有當客戶端發送下一個請求到服務器時,它纔會起作用。你需要做的是在一個單獨的線程中運行方法run()中的邏輯,並在那裏捕獲InterruptedException和ClosedByInterruptException並清理並返回。在你的stopButton點擊你將調用你的線程中的interrupt()方法。閱讀有關它here