Как автоматически закрыть сервер Java? - PullRequest
0 голосов
/ 20 января 2012

Мне нужен способ автоматического закрытия серверной программы, которая запускается с использованием какого-либо таймера. До сих пор это то, что я получил

    long start = System.currentTimeMillis();
    long end = start + 10 * 1000; // 60 seconds * 1000 ms/sec

    while (System.currentTimeMillis() < end) {
        Socket connectionSocket = welcomeSocket.accept();
        BufferedReader inFromClient = new BufferedReader(
                new InputStreamReader(connectionSocket.getInputStream()));
        DataOutputStream outToClient = new DataOutputStream(
                connectionSocket.getOutputStream());
        clientSentence = inFromClient.readLine();
        System.out.println("Received: " + clientSentence);
        capitalizedSentence = clientSentence.toUpperCase() + '\n';
        outToClient.writeBytes(capitalizedSentence);
        count = count + 1;

    }
    welcomeSocket.close();

Возможно ли это? Пожалуйста, помогите, а не голосуйте. Я своего рода новичок в отношении клиент-сервер в Java.

Ответы [ 3 ]

1 голос
/ 20 января 2012

Запустите код, который у вас есть, в потоке (имя сервера в коде ниже), а затем запустите другой поток, подобный этому, для прерывания, когда вы хотите выйти:

Thread server = {the one you have};
Thread timeout = new Thread() {
    public void run() {
        long end = start + 10 * 1000;
        try {
            Thread.sleep(end);
        } catch (InterruptedException e) {
            //handle this
        }
        server.interrupt();
    }
}
timeout.start();

Сокет.accept теперь выдаст InterruptedException и пропустит весь ваш другой код.

1 голос
/ 20 января 2012

Для этого можно использовать setSoTimeout .

Обычно вы устанавливаете это с некоторым значением, например, 100 мс, вводите цикл и принимаете вызов.Когда выдается исключение тайм-аута, вы проверите, нормально ли оно выйти или нет, и либо выпадете из цикла, либо продолжите.

Затем убедитесь, что вы очистили сокет, когда закончите.

0 голосов
/ 20 января 2012

Я не уверен, что вы в порядке с Threads. Все равно рекомендую взглянуть на класс Timer.

Вы можете создать Timer, который создал поток для закрытия вашего сервера. Вы можете установить соединение как final variable, а затем использовать synchronised доступ к нему, чтобы закрыть его, как только Timer вступит в силу.

...