Обработка полученных сообщений непосредственно в клиенте (используя nio через netty-framework) - PullRequest
1 голос
/ 14 сентября 2011

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

Но я хотел бы использовать или лучше получать / принимать некоторые сообщения непосредственно в клиенте, а не(просто) в обработчике.Поэтому мой вопрос заключается в том, возможно ли иметь некоторый слушатель для получения сообщений непосредственно в клиентской программе, а не в ее обработчиках.Суть в том, что я хотел бы получить доступ к полученным сообщениям в (исполняемой) программе (в основном это класс с методом main), который создал новый клиентский объект, используя что-то вроде таймера, который (или цикл) будет периодически проверять наличие новыхсообщений.

Буду признателен, если кто-то может помочь мне с этой проблемой.Или, по крайней мере, скажите мне, если это возможно с Netty.

1 Ответ

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

Вы хотите перевести основанную на событиях модель netty в модель опроса. Простой способ сделать это - создать очередь сообщений:

//import java.util.concurrent.BlockingQueue;
//import java.util.concurrent.LinkedBlockingQueue;
BlockingQueue queue = new LinkedBlockingQueue();

Вам нужно сделать очередь доступной для вашего обработчика в качестве аргумента конструктора, а когда приходит сообщение, вы помещаете его в очередь:

// Your netty handler:
queue.put(message);

На стороне клиента вы можете опросить очередь на наличие сообщений:

// The polling loop in your program:
message = queue.poll(5, TimeUnit.SECONDS);

BlockingQueue предлагает вам выбор между ожиданием прибытия сообщения (take()), ожиданием определенного времени прибытия сообщения (poll(long, TimeUnit)) или простой проверкой того, доступно ли какое-либо сообщение прямо сейчас (poll()).

С точки зрения дизайна, этот подход убивает неблокирующее преимущество ввода-вывода, которое должен дать вам netty. Вы могли бы использовать обычное Socket соединение для того же результата.

...