Как я могу остановить метод блока DatagramSocket.receive () в потоке - PullRequest
9 голосов
/ 01 ноября 2011

Я создаю DatagramSocket в главном потоке, а затем создаю внутренний поток класса для прослушивания порта. когда я закрываю DatagramSocket в главном потоке, он всегда сталкивался с ошибкой socket closed, потому что во внутреннем потоке класса я вызывал метод receive(), и он блокировал внутренний поток класса. вот код внутреннего класса:

class ReceiveText extends Thread
{
    @Override
    public void run()
    {
        while(true)
        {
            byte[] buffer = new byte[1024];
            DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
            try {
                udpSocket.receive(dp);//blocked here
                byte[] data = dp.getData();
                String message = new String(data, 0 , dp.getLength());
                setTxtAreaShowMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Я хочу остановить внутренний поток класса перед закрытием DatagramSocket, но метод stop() не рекомендуется. как я могу это сделать?

Ответы [ 3 ]

14 голосов
/ 01 ноября 2011

Закройте сокет, который остановит вызов receive () от блокировки.Если вы сначала установили закрытый флаг, то в блоке catch (IOException) вы можете спокойно игнорировать исключение, если этот флаг установлен.(Возможно, вы могли бы также использовать метод isClosed () в DatagramSocket вместо флага)

2 голосов
/ 05 ноября 2014

Socket.close () делает свое дело.Или вы можете использовать socket.setSoTimeout (1000);метод setSoTimeout () позволяет вам определять период ожидания в миллисекундах.Например:

//if the socket does not receive anything in 1 second, 
//it will timeout and throw a SocketTimeoutException
//you can catch the exception if you need to log, or you can ignore it
socket.setSoTimeout(1000); 
socket.receive();

Вот javadoc для setSoTimeout () ;

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

Вот пример ответа на этом сайте: установка времени ожидания для получения сокета

1 голос
/ 01 ноября 2011

С помощью UDP вы можете отправить сокету дейтаграмму из другого потока, поэтому разблокируйте чтение ().Датагран может (в зависимости от вашего протокола) содержать команду «самоубийство» или вы можете использовать дополнительный логический параметр «выключения», который поток читает после возврата read ().

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