Читая руководство по 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()
. Итак, в этой ситуации я могу использовать ОДНО сообщение для отправки на сервер и ОДНО сообщение для получения с сервера, и это плохо для меня, и я думаю, не только для меня: ( Как я могу использовать разные сообщения только для одного соединения? Возможно, я могу создать несколько 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()));
или другие техники? Большое спасибо.