2016-09-05 10 views
1

次のコードでは、Javaアプレットを使用してボタンを押すとサーバーを停止しようとしています。起動はスレッドを使用してうまく動作しますが、私は、サーバーの停止を得ていないのです揮発性 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

のコードは、あなたがそれを停止する前に、新しいインスタンスを作成しますので、それが停止しないと、そうでないですあなたの現在のインスタンスTCPServerrequestStop()を呼び出すはずですが、最初に起動してください。

// 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の別のインスタンスにアクセスしています。したがって、2番目のオブジェクトに値 "Stop"を設定します。開始ボタンで作成された最初のインスタンスには影響しません。

両方のボタンのアクションリスナの実装外でTCServerをインスタンス化して、両方のボタンに対してその1つのインスタンスを使用してください。原因https://docs.oracle.com/javase/7/docs/api/java/net/ServerSocket.html#accept()

ServerSocket::accept

0

はブロッキング方式なので、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

関連する問題