2017-01-26 4 views
0

pls. голый со мной; Я новичок в Netty.Объединение 2 серверов Netty в одном

У меня есть один Netty-сервер (в основном взятый из примера Netty ObjectEchoServer), который запущен в плагине OSGi. Сервер привязан к порту 51515 и работает так, как должен. До сих пор я понимаю основную концепцию.

Теперь мне нужно добавить какой-нибудь «встроенный сервер Http» для моего подключения. Я запустил HTTPServer из примеров Netty и изменил его, чтобы он соответствовал моим потребностям. Сервер привязан к отдельному порту 51516.

Мне нужна помощь, приведя два сервера вместе. Оба сервера отличаются только в своих обработчиках.

ObjectEcho

extends SimpleChannelInboundHandler<Object> 

в то время как HTTPServer

extends SimpleChannelInboundHandler<FullHttpRequest> 

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

Что я хочу достичь, так это то, что на обоих серверах используется только один порт.

ответ

0

Если у вас все еще есть два разных порта, вы можете через Java-наследие создать свой собственный «бизнес-обработчик», а затем сначала добавить обработчик протокола (эхо-код и http-один), а во-вторых - собственный обработчик вашего бизнеса.

Конечно, все зависит от возможного объекта, передаваемого этому бизнес-обработчику, так как он должен быть таким же, независимо от того, что делают эхо или обработчики http в первый раз.

Кстати, это хорошая практика, чтобы отделить «протокол» от «бизнес» обработчиками ...

ответ Update:

В вашем трубопроводе, для обоих серверов (2 порта) , сначала добавьте драйвер «protocol» с расширением ChannelDuplexHandler вместо SimpleChannelInboundHandler, а затем добавьте свой собственный обработчик (на основе SimpleChannelInboundHandler).

Из бизнеса протокола перейдите к входящему бизнес-обработчику объекта по желанию и верните объект, чтобы преобразовать обратно в протокол ChannelDuplexHandler.

Таким образом, вы выделяете протокол (кодек) и бизнес.

Даже если это не совсем то, что вы хотите, вы можете посмотреть пример/src/main/java/io/netty/example/spdy/client, который показывает, как это сделать (на стороне клиента, но на стороне сервера это точно такой же принцип).

Второе обновление:

иметь только один порт, он является более сложным, так как вы должны будете тогда зайцем ранее ChannelDuplexHandler, который будет анализировать первые байты indentify правильного типа протокола. Затем вы можете динамически подключить к конвейеру необходимые обработчики (протокол и бизнес).

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

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

+0

Для эха все объекты POJO, содержащие строки, которые используются EchoHandler для запуска запросов на сервере. Сервер отправляет обратно строки. –

+0

HTTP-часть получила HTTPRequest и возвращает сборку HTML-страницы из журнала (текстовые файлы) –

+0

Можете ли вы опубликовать некоторый псевдокод. Это даст мне лучшее понимание –

Смежные вопросы