Читая руководство по 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()));
или другим методам? Большое спасибо.