как работает многопоточный сервер? - PullRequest
0 голосов
/ 17 апреля 2011

Я получил от кого-то этот пример с многопоточным сервером на Android:

http://tutorials.jenkov.com/java-multithreaded-servers/singlethreaded-server.html

Но у меня есть несколько трудностей с пониманием части кода:

while(! isStopped()) {
    Socket clientSocket = null;
    try {
        clientSocket = this.serverSocket.accept();
    } catch (IOException e) {
        if (isStopped()) {
            System.out.println("Server Stopped.") ;
            return;
        }
        throw new RuntimeException("Error accepting client connection", e);
    }

Что я не понимаю, так это то, что происходит, когда у меня есть исключение в этой строке:

clientSocket = this.serverSocket.accept();

Из того, что я могу сказать, является то, что эта функция вызывается:

private synchronized boolean isStopped() {
    return this.isStopped;
}

Но как закрыть эту розетку?Потому что, если вы получаете исключение при попытке принять клиента, вы должны закрыть сокет, возвращенный методом accept.

Я предполагаю, что это сделано здесь:

public synchronized void stop() {
    this.isStopped = true;
    try {
        this.serverSocket.close();
    } catch (IOException e) {
        throw new RuntimeException("Error closing server", e);
    }
}

Но где stop() призвал, как получается установить связь между isStopped() и onStop() .... И что с этим "синхронизировано"?

Надеюсь, мне ясно с моими неясностями!Спасибо заранее :) 1025 *

1 Ответ

1 голос
/ 27 сентября 2011

Вы, вероятно, пошли дальше, но для потомков ...

что произойдет, когда у меня возникнет исключение в этой строке

clientSocket = this.serverSocket.accept();

Если вы получитеисключение внутри accept, тогда сокет не возвращается, поэтому закрывать нечего.Либо accept() возвращает действительный сокет, который вы должны обработать, а затем закрываете , либо выдает исключение.Никогда оба.

где вызывается stop()?

Остановка выглядит так, что она вызывается из внешнего мира каким-то вызывающим абонентом, который хочет отключить сокет сервера.На сервере вы создаете сокет-сервер, а затем принимаете отдельные подключения к удаленным клиентам, которые возвращают сокет для этого клиента.Каждый из обработчиков клиента должен закрывать свои собственные индивидуальные соединения.Когда сервер выключается (в этом случае, когда вызывается stop()), сокет-сервер затем закрывается.

После вызова stop() сокет сервера закрывается и метод accept()выбросит исключение.Вот почему в коде есть проверка if(isStopped()), чтобы исключить исключение.

как установить соединение между isStopped() и onStop()

isStopped() - это закрытый метод, который проверяет, вызвал ли кто-то метод stop().Я полагаю, onStop() это метод Android?Они не связаны, хотя кто-то может захотеть позвонить singleThreadedServer.stop() внутри onStop().

что с этим synchronized?

Используется ключевое слово synchronizedмногопоточными программами как мьютекс и барьер памяти.Это позволяет только 1 потоку выполняться внутри блока synchronized одновременно.Это также гарантирует, что все локальные переменные синхронизируются между потоками и центральной памятью.См. Документацию по Java:

http://download.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

Синхронизация этого частного метода - это действительно грубая ИМО.Я предполагаю, что это делается, чтобы убедиться, что isStopped был обновлен.Я бы использовал volatile логическое значение или AtomicBoolean вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...