Netty + ProtoBuffer: несколько коммуникационных сообщений для одного соединения

Читая руководство по Netty, я нашел простое описание того, как интегрировать Netty и Google Буферы протокола . Я начал исследовать его пример (поскольку в документации больше нет информации) и написал простое приложение, подобное примеру приложения местного времени. Но в этом примере используется статическая инициализация в классе PipeFactory, например:

import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.handler.codec.protobuf.ProtobufDecoder;
import org.jboss.netty.handler.codec.protobuf.ProtobufEncoder;
import org.jboss.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder;
import org.jboss.netty.handler.codec.protobuf.ProtobufVarint32LengthFieldPrepender;

import static org.jboss.netty.channel.Channels.pipeline;

/**
 * @author sergiizagriichuk
 */
class ProtoCommunicationClientPipeFactory implements ChannelPipelineFactory {

    public ChannelPipeline getPipeline() throws Exception {
        ChannelPipeline p = pipeline();
        p.addLast("frameDecoder", new ProtobufVarint32FrameDecoder());
        p.addLast("protobufDecoder", new ProtobufDecoder(Communication.DataMessage.getDefaultInstance()));

        p.addLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender());
        p.addLast("protobufEncoder", new ProtobufEncoder());

        p.addLast("handler", new ProtoCommunicationClientHandler());
        return p;
    }

}

(Обратите внимание на строку p.addLast ("protobufDecoder", new ProtobufDecoder (Communication.DataMessage.getDefaultInstance ())); ) и можно создать только одну фабрику (насколько я понимаю) для класса ClientBootstrap я имею в виду метод bootstrap.setPipelineFactory () . Итак, в этой ситуации я могу использовать ONE сообщение для отправки на сервер и ОДНО сообщение, которое нужно получить с сервера, и это плохо для меня, и я думаю, не только для меня :( Как я могу использовать разные сообщения для одного и того же подключения? Возможно, я смогу создать несколько protobufDecoder , подобных этому

p.addLast("protobufDecoder", new ProtobufDecoder(Communication.DataMessage.getDefaultInstance()));
p.addLast("protobufDecoder", new ProtobufDecoder(Communication.TestMessage.getDefaultInstance()));
p.addLast("protobufDecoder", new ProtobufDecoder(Communication.SrcMessage.getDefaultInstance()));

или другим методам? Большое спасибо.

15
задан La-comadreja 7 February 2014 в 17:20
поделиться