Вопрос

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

По сути, приведенный ниже код настроен на отправку «Hello World», который сервер распечатывает после того, как версия была проверена при установлении соединения. По крайней мере теоретически, на самом деле это не совсем работает;)

В настоящее время у меня:

Client.java

родовое слово

VersionClientHandler.java

родовое слово

BusinessLogicClientHandler.java

родовое слово

Server.java

родовое слово

VersionServerHandler.java

родовое слово

BusinessLogicServerHandler.java

родовое слово

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

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

Это было полезно?

Решение

Я нашел решение !!!

Возник ряд проблем.

В VersionClientHandler новый код:

родовое слово

Обратите внимание на последнюю строку, e.getChannel().write(version); вместо Channels.write(ctx, e.getFuture(), versionBuffer);. Я не уверен, почему. Фактически, я собираюсь начать выяснять, почему у меня там код ChannelBuffers, потому что он, похоже, ничего не делает ...

Теперь на VersionServerHandler.java:

родовое слово

Обратите внимание, что я больше не читаю буфер, я просто генерирую код и преобразую его в объект правильного типа. Выше этого я добавил e.getMessage(), который предназначен для удаления этого обработчика из любой дальнейшей обработки. После первоначального подключения он больше не требуется. Спасибо Деннису за совет.

< sizesЗаключение

В остальном все, как я ожидал. Ключ в том, что я неправильно понимал, как читать буферы и передавать информацию. И сообщения об ошибках и примеры были не совсем ясными. Как только вы добавите каналы POJO из Netty в свой конвейер, вам нужно будет начать работать только с объектами для всех обработчиков. Я пропустил это. Концепции были правильными, просто то, как я пытался читать данные с каналов, было неправильным.

Другой важный совет - удалить обработчики из конвейера, если они вам не нужны после первоначального подключения. Я предполагаю, что то же самое будет верно и для обработчика аутентификации. Было бы здорово получить подтверждение здесь, но мне придется выяснить это позже.

Другие советы

Вы не упомянули, в чем заключалась ошибка.

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

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

Обработчик BusinessLogic должен находиться в конвейере последним.Просто имейте в виду, что любой из ваших обработчиков выполняет некоторую блокирующую операцию, вы должны подумать о добавлении ExecutionHandler перед ним в m Убедитесь, что поток ioworker не будет заблокирован и, таким образом, сделает netty-сервер безответственным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top