Как я могу проверить некоторую переменную, пока код удерживает прием нового сокета? - PullRequest
1 голос
/ 31 июля 2011

В приложении, которое я создал, сервер принимает сокетное соединение от клиентов и выполняет различную работу.Список клиентов хранится в clients, который имеет тип LinkedList.

Я использую оператор while с условным оператором, основанным на размере очереди clients.

Я хочузнать, есть ли способ решить проблемы, описанные ниже ... чтобы сервер не зависал вечно.

while(clients.size()>0){ //few clients the queue is alive at the moment
    //Suddenly, all clients in the queue shut down at this point in the while loop,
    //Another thread, which checks clients knows that clients are dead
    //so clients.size() becomes 0, but there is no way to check that at this point
    //and server is expecting for connection clients forever

    Socket socket= server.accept();
    socket.close();
}
//printout results

edit

Список клиентов не простосуществующие клиенты.Это список живых клиентов.Этот список обновляется другим потоком.

У меня есть предложение while, потому что я хочу выполнить какую-то работу после того, как не останется живых клиентов.(либо закончил свою работу, либо просто умер)

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

Ответы [ 5 ]

2 голосов
/ 31 июля 2011

Вы можете установить таймаут на ServerSocket и поймать SocketTimeoutException:

server.setSoTimeout(1000);
while (clients.size() > 0) {
    try {
        server.accept();
    }
    catch (SocketTimeoutException e) {
        // Ignore
    }
}

Таким образом, вы будете проверять состояние списка клиентов каждую секунду или около того.

Не забудьте синхронизировать доступ к clients, если к нему обращаются другие потоки. Либо оберните его, используя Collections.synchronizedList, либо установите соответствующую синхронизацию в частях кода, которые обращаются к переменной.

0 голосов
/ 31 июля 2011

Как насчет дополнительного потока, чтобы остановить serversocket, когда все клиенты ушли?:) Что-то вроде

new Thread() {
    public void run() {
        if (clients.isEmpty()) {
            try { server.close();} catch (IOException e){...}
        }
    }
}.start();

while(clients.size()>0){ 
    if (!clients.isEmpty()) {
        Socket socket= server.accept();
        socket.close();
    }
}
0 голосов
/ 31 июля 2011

Похоже на необходимость синхронизации на клиентах, чтобы размер клиентов изменялся в известных точках.

0 голосов
/ 31 июля 2011

Я не уверен, что полностью понял ваш вопрос, но при условии, что может сработать следующее.Первое предположение заключается в том, что в вашем классе Client есть флаг alive , указывающий, жив он или нет.

while(clients.size()>0){
    client = clients.remove();
    if (client.isAlive()) {
        Socket socket= server.accept();
        socket.close();
    }
}
0 голосов
/ 31 июля 2011

Ваше состояние цикла не имеет никакого смысла для меня. Почему вы были бы заинтересованы в принятии новых клиентов только при наличии существующих клиентов? Как этот процесс начинается?

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

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