2013-03-26 4 views
0

Я реализую функцию обратного вызова между клиентами и сервером.Timer and DatagramSockets java

Клиент регистрируется на сервере, и когда происходит событие, сервер отправляет клиенту datagrampacket, чтобы сообщить клиенту о событии.

Клиент будет заблокирован в течение всего периода прослушивания, указанный пользователем

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

while (waiting) { 
    aSocket.setSoTimeout(0); 
    aSocket.receive(reply); 
    String replyString = new String(reply.getData()).trim(); 
    System.out.println(replyString); 
    buffer = new byte[1000]; 
    reply = new DatagramPacket(buffer, buffer.length); 
} 

Я закодировал таймер с TimerTask, который изменяет значение ожидания от истинного на ложное после того, как период прослушивания закончен.

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

aSocket.receive(reply); 

кто-нибудь здесь знает, как я могу пропустить ли этот код и выход из цикла?

спасибо.

ответ

1

От javadoc

Тайм-аут должен быть> 0. Тайм-аут нуля интерпретируется как бесконечного тайм-аута.

Итак, когда вы используете 0 для setSoTimeout(), он просто блокируется при получении().

+0

Предполагалось, что если я установил тайм-аут, скажем 5000 мс, если сервер отправит сообщение на 5001 мс, клиент будет вызывать исключение тайм-аута вместо прослушивания сообщения. – Wilson

+0

Да, вам нужно будет установить подходящий тайм-аут и обработать «TimeoutException» из-за характера блокировки 'receive()'. Если вы знакомы с java NIO, есть некоторые неблокирующие опции. –

+0

Я попробую ваш метод. Не очень уверен в Java NIO. не думайте, что мой учитель хотел бы, чтобы мы пошли таким образом. – Wilson