1

HTTP スレッドプール サーバーをシャットダウンしたい。そのために、STDIN をリッスンする 1 つのスレッドを作成します。と入力shutdownすると、サーバーがシャットダウンされます。

コードは

public class WebServerShutdown extends Thread{

    Logger log = Logger.getLogger( WebServerShutdown.class.getName() );

    @Override
    public void run() {
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            //ThreadPool threadpool = new ThreadPool();
            String s;
            while ((s = in.readLine()) != null && s.length() != 0) {
                System.out.println(s);
                if(s.equalsIgnoreCase("shutdown")) {
                    ThreadPool.isStopped = true;
                    break;
                }
            }
        } catch (IOException ex) {
            log.info(new Date() + " Problem in reading Input from keyboard");
        }
        System.out.println("Thread comes out");
    }
 }

サーバーがリッスンするコード

    while( !(ThreadPool.isStopped) ) {
        Socket client_socket = null;
        try {
            System.out.println("try to accept socket");
            client_socket = serversocket.accept();
        } catch(IOException ie) {
            log.info(new Date() + " Server Stopped");
        }
        ThreadPool.threads.execute(new Worker(client_socket));          
    }

    System.out.println("Reached here");

ThreadPool.threads.shutdown();
serversocket.close();

log.info(new Date() + " WEBSERVER STOPPED");

しかし、1 つ問題があります。shutdown を書くと、その時点でサーバーがループに入り、クライアントの要求をリッスンします。そのため、クライアントにリクエストを送信すると、その後サーバーが閉じられます。

しかし、それは良くありません。シャットダウンを書くときはいつでも、他のクライアント要求を受け付けません。

上記のコードを正しくするのを手伝ってください。

4

2 に答える 2

0

Close()ServerSocketのメソッドを呼び出す必要がありますが、そのスレッドの外にあります。そのメソッドを呼び出すと、 で IOException がスローされます。accept()これをキャッチしてから呼び出しbreak;て、そのループを停止します。

     if(s.equalsIgnoreCase("shutdown")) {
                                ThreadPool.isStopped = true;
                                ClassListening.ServerSocket.close();
                                break;
        }

// Break the loop where the ServerSocket was listening

            try {
                        System.out.println("try to accept socket");
                        client_socket = serversocket.accept();
                    } catch(IOException ie) {
                        log.info(new Date() + " Server Stopped");
                        break;
                    }
于 2013-05-06T12:37:49.977 に答える
0

serversocket closesソケットの場合、accept例外をキャッチする必要がSocketExceptionあり、これは次のようになります。

WebServerShutdown クラス

@Override
public void run() {
    try {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String s;
        while ((s = in.readLine()) != null) {
            System.out.println(s);
            if(s.equalsIgnoreCase("shutdown")) {
                ThreadPool.isStopped = true;
                break;
            }
        }
    } catch (IOException ex) {
        log.info(new Date() + " Problem in reading Input from keyboard");
    }
    System.out.println("Thread comes out");
    try {
        WebServer.serversocket.close();
    } catch(IOException ie) {
        log.info(new Date() + " Problem in closing socket");
    }
}

サーバーがリッスンするコード

     while( !(ThreadPool.isStopped) ) {
            Socket client_socket = null;
            try {
                client_socket = serversocket.accept();

            } catch(SocketException se) {
                log.info(new Date() + " WEBSERVER STOPPED");
            }

            if(ThreadPool.isStopped) break;
            ThreadPool.threads.execute(new Worker(client_socket));          
     }
于 2013-05-10T05:08:52.817 に答える