Netty + ProtoBuffer: quelques messages de communication pour une connexion

Lors de la lecture de la Netty tutoriel, j'ai trouvé un simple description de comment intégrer Netty et Google Protocol Buffers. J'ai commencé à étudier son exemple (car il n'y a pas plus d'informations dans la documentation) et écrit une application simple comme dans l'exemple que l'heure locale de l'application. Mais cet exemple est à l'aide d'initialisation statique dans PipeFactory Classe, par exemple:

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;
    }

}

(Veuillez jeter un oeil à la ligne p.addLast("protobufDecoder", new ProtobufDecoder(Communication.DataMessage.getDefaultInstance()));)
et juste une usine peut être créé (comme je le comprends) pour ClientBootstrap classe, je veux dire bootstrap.setPipelineFactory() méthode. Si, dans cette situation je peux utiliser UN message à envoyer au serveur et UN message pour recevoir depuis le serveur, et c'est mauvais pour moi, et je ne pense pas juste pour moi 🙁 Comment puis-je utiliser différents messages vers et à partir pour juste un lien?
Peut-être que je peux créer un peu de protobufDecoder comme ce

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

ou d'autres techniques?
Merci beaucoup.

Vous pouvez ajouter de nombreux décodeurs/encodeurs dans le pipeline, mais ils devraient être en mesure de transmettre des données qu'ils ne savent pas comment gérer. Regarder les netty source sur github il semble qu'Il n'est pas le cas. Donc il y a probablement un moyen de le faire, mais je suis sceptique, il s aussi simple. Essayez tout de même et à partager les résultats 🙂
Oui, Il n'est pas simple et veut travailler dur 🙁

OriginalL'auteur Sergii Zagriichuk | 2011-10-18