Как отправить более одного ответа клиенту от Netty

Я хочу отправить более одного ответа на client на основе внутреннего процесса. Но в Netty примерах я видел, что echo server одновременно отправляет обратно response.

Мое требование: мне нужно проверить клиента и отправить ему ответ OK, а затем отправить ему обновления DB, когда они будут доступны.

Как я могу отправить больше responses client? Пожалуйста, направьте меня к примеру или любому руководству?


person user2771655    schedule 22.01.2014    source источник
comment
Конечно. Вот пожалуйста. Может быть, прочитайте «Начало работы».   -  person Elliott Frisch    schedule 22.01.2014
comment
@Elliott, ты имеешь в виду, что я могу перенести Канал через свою программу и использовать его, когда захочу позже. Это?   -  person user2771655    schedule 22.01.2014
comment
Я не могу ответить на это. Это зависит от вашего протокола.   -  person Elliott Frisch    schedule 22.01.2014
comment
@Elliott В примерах, приведенных на указанном вами сайте, использовался TCP / IP, верно? Если я использую то же самое?   -  person user2771655    schedule 22.01.2014
comment
Нет. Теперь вы описываете канал. Что вы хотите сообщить? Как он должен масштабироваться? Вы пытаетесь написать веб-сервер? Это для потокового видео? и т.п.   -  person Elliott Frisch    schedule 22.01.2014
comment
@Elliott Мой клиент отправляет мне XML-запрос, и мой сервер отвечает XML.   -  person user2771655    schedule 22.01.2014
comment
Вы и ваш клиент должны договориться о том, как будет сделан XML-запрос и как будет возвращен XML-ответ. Это ваш протокол. Похоже, ваш клиент отправляет вам полезную нагрузку XML. Затем они закрывают сокет? Если это так, вы можете отправить только один ответ.   -  person Elliott Frisch    schedule 22.01.2014
comment
@Elliott Нет, они держат открытым сокет для моих ответов. Эта связь может длиться долго. Также для моего Сервера может быть более или менее 1000 клиентов.   -  person user2771655    schedule 22.01.2014
comment
давайте продолжим это обсуждение в чате   -  person user2771655    schedule 22.01.2014


Ответы (3)


в каждой точке конвейера вы можете получить конвейер Объект Channel из MessageEvent (или ChannelEvent) который передается от обработчика к обработчику. вы можете использовать эту информацию для отправки нескольких ответов в разные точки конвейера.

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

    public class EchoServerHandler extends ChannelHandlerAdapter {

        public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
           Channel ch = e.getChannel();
           // first message
           ch.write(e.getMessage());
        }
        // ...
    }

    public class EchoServerHandler2 extends ChannelHandlerAdapter {

           public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
           Channel ch = e.getChannel();
           // send second message     
           ch.write(e.getMessage());
        }
        // ...
    }
person Yoav Slomka    schedule 22.01.2014

Вы можете сделать это, если у вас есть ссылка на соответствующий Channel (или ChannelHandlerContext). Например, вы можете сделать это:

public class MyHandler extends ChannelHandlerAdapter {
  ...
  public void channelRead(ctx, msg) {
    MyRequest req = (MyRequest) msg;
    ctx.write(new MyFirstResponse(..));
    executor.execute(new Runnable() {
      public void run() {
        // Perform database operation
        ..
        ctx.write(new MySecondResponse(...));
      }
    }
  }
  ...
}
person trustin    schedule 23.01.2014

Вы можете делать это до тех пор, пока Нетти не закроет канал. Когда закончите, вам лучше вызвать close() самостоятельно.

Вот пример: https://stackoverflow.com/a/48128514/2557517

person Kira    schedule 06.01.2018